2012-06-21 21 views
8

Tôi có một thể hiện của MSXML2.DomDocument.Tôi có thể lưu MSXML2.DomDocument bằng thụt lề bằng cách nào? (Tôi nghĩ rằng nó sử dụng MXXMLWriter)

Tôi sóng để lưu nó, với thụt lề.

Mã này hoạt động, nhưng không thụt lề:

var dom = new ActiveXObject("MSXML2.DomDocument"); 
// fiddle with dom here 
dom.save(filename); 

Tôi nghĩ rằng tôi có thể sử dụng một đối tượng MXXMLWriter để bơm thụt.

Làm cách nào?

Trả lời

6

Điều này sẽ làm điều đó.

function saveDomWithIndent(dom, filename) { 
    var writer = new ActiveXObject("MSXML2.MXXMLWriter"), 
     reader = new ActiveXObject("MSXML2.SAXXMLReader"), 
     fso = new ActiveXObject("Scripting.FileSystemObject"), 
     textStream = fso.CreateTextFile(filename, true); 
    writer.indent = true; 
    writer.omitXMLDeclaration = true; 
    reader.contentHandler = writer; 
    reader.parse(dom); 
    textStream.Write(writer.output); 
    textStream.Close(); 
} 

Sử dụng nó như thế này:

var root, node, newnode, 
    dom = new ActiveXObject("MSXML2.DOMDocument.6.0"); 
dom.async = false; 
dom.resolveExternals = false; 
dom.load(fullpath); 
root = dom.documentElement; 
node = root.selectSingleNode("/root/node1"); 
if (node !== null) { 
    newnode = dom.createElement('node2'); 
    newnode.text = "hello"; 
    root.appendChild(newnode); 
    saveDomWithIndent(dom, fullpath); 
} 

tôi không thể tìm ra cách để điều chỉnh mức thụt lề. Nó luôn thụt lề với một tab .

1

Có một cách khác để xác định đầu ra xml, cộng với bạn có thể điều chỉnh mức thụt lề theo cách thủ công: XSL.

var adSaveCreateOverWrite = 2 
var Indent = new ActiveXObject("MSXML2.DomDocument"); 
    Indent.async = false; 
    Indent.resolveExternals = false; 
    Indent.load("indent.xsl"); 
var Doc = new ActiveXObject("MSXML2.DomDocument"); 
    Doc.async = false; 
    Doc.resolveExternals = false; 
    Doc.load("dirty.xml"); 
with(new ActiveXObject("ADODB.Stream")){ 
    Charset = "utf-8"; 
    Open(); 
    WriteText(Doc.transformNode(Indent)); 
    SaveToFile("pretty.xml", adSaveCreateOverWrite); 
    Close(); 
} 

indent.xsl

<?xml version="1.0" encoding="ISO-8859-15"?> 
<!-- http://x443.wordpress.com/2011/page/34/ --> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml"/> 

    <xsl:template match="@*"> 
    <xsl:copy/> 
    </xsl:template> 

    <xsl:template match="text()"> 
    <xsl:value-of select="normalize-space(.)" /> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:param name="indent" select="''"/> 
    <xsl:text>&#xa;</xsl:text> 
    <xsl:value-of select="$indent" /> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|*|text()"> 
     <xsl:with-param name="indent" select="concat($indent, ' ')"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    <xsl:if test="count(../*)>0 and ../*[last()]=."> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:value-of select="substring($indent,3)" /> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 
+0

tốt đẹp. Điều này dẫn đến câu hỏi theo dõi - tôi có thể sử dụng XSL dựng sẵn, một trong các trang tính XSL được nhúng trong msxml6.dll, để thực hiện thụt đầu dòng không? Tôi cho rằng nó sẽ là cần thiết để trích xuất XSL sau đó, sau đó áp dụng nó. – Cheeso

+0

@Cheeso Xin lỗi, tôi không hiểu chính xác ý bạn là gì. Trên thực tế, tôi đang sử dụng cá thể 'FreeThreadedDomDocument' như một đối tượng tĩnh được lưu trữ trong phạm vi Application (được khởi tạo trên sự kiện' Application_OnStart') với ASP cổ điển. Điều này ngăn cản các giao dịch định kỳ cho mỗi biến đổi. –

+0

Tôi biết đây là luồng nhận xét cũ, nhưng ... để giải thích ý tôi muốn nói ở trên: Tôi nghĩ msxml bao gồm ít nhất một XSLT dựng sẵn. xem http://stackoverflow.com/questions/9463402/default-xml-stylesheet-in-chrome Lý do tôi hỏi là, nó sẽ đơn giản hơn nếu tôi có thể sử dụng một xslt dựng sẵn thay vì nhúng bảng tùy chỉnh của riêng tôi. – Cheeso

-1

Nếu bạn không muốn sử dụng xsl, bạn chỉ có thể chèn vbcrlfs. Mọi ">" phải theo vbcrlf, trừ khi ">" được theo sau bởi một số. Sau đó tạo tập tin xml mới từ chuỗi đó - bây giờ nó có dòng mới và thụt lề. VBA MSAccess:

Dim objDom As DOMDocument 
Set objDom = CreateObject("MSXML2.DOMDocument") 

tạo tài liệu với objDom.append, sau đó chơi với chuỗi (xml tôi vừa số):

ss = objectDom.XML 
For i = 1 To Len(ss) 
c = Mid(ss, i, 1) 
    If InStr(1, Mid(ss, i, 1), ">") > 0 Then 
     a = Asc(Mid(ss, i + 1, 1)) 
     If a < 48 Or a > 57 Then 
      ss1 = Mid(ss, 1, i) 
      ss2 = Mid(ss, i + 1, Len(ss)) 
      ss = Mid(ss, 1, i) & vbCrLf & Mid(ss, i + 1, Len(ss)) 
     End If 
    End If 

Next i 

objDom.loadXML ss 
objDom.Save (file_path) 
+0

Câu hỏi là về js (var vs dim) ... trong vba xem xét sử dụng tùy chọn rõ ràng. Sau đây là hữu ích cho tôi, trong trường hợp ai đó đang tìm kiếm nó: http://www.vb-helper.com/howto_formatted_xml_document.html –

Các vấn đề liên quan