2012-06-21 419 views
8

私はMSXML2.DomDocumentのインスタンスを持っています。インデント付きのMSXML2.DomDocumentを保存するにはどうすればよいですか? (私はそれがMXXMLWriterを使用すると思う)

私はそれを保存するために波打つように波打つ。

このコードは動作しますが、インデントされていません。

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

私はインデントを注入するMXXMLWriterオブジェクトを使用することができると思います。

どのようにですか?

答えて

6

これは間違いありません。

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(); 
} 

はこのようにそれを使用します。

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); 
} 

私はインデントレベルを調整する方法を見つけ出すことができませんでした。 タブで常にインデントされます。

1

xml出力を事前確認する別の方法があります。また、インデントレベルを手動で調整することもできます。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

素敵:

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

が、その後、objDom.appendで文書を作成した文字列で遊ぶには、(私のXMLは、数字だけを持っていました)。これはfollowonの質問につながります - インデントを実行するためにmsxml6.dllに埋め込まれたXSLシートの1つである組み込みXSLを使用できますか?プログラムでXSLを抽出して適用する必要があると思います。 – Cheeso

+0

@Cheeso申し訳ありませんが、私はあなたが何を意味しているのか正確には分かりませんでした。実際には、私はFreeThreadedDomDocument'インスタンスを、Classic ASPを使ってApplicationスコープ( 'Application_OnStart'イベントで初期化)に格納された静的オブジェクトとして使用しています。これにより、各トランスフォームの定期的なトランザクションが防止されます。 –

+0

これは今、古いコメントストリームであることは分かっていますが...先ほどの意味を説明するために:msxmlには少なくとも1つの組み込みXSLTが含まれていると思います。 http://stackoverflow.com/questions/9463402/default-xml-stylesheet-in-chrome私が尋ねる理由は、私自身のカスタムシートを埋め込むのではなく、組み込みのxsltを使うことができれば簡単になるということです。 – Cheeso

-1

あなたはXSLを使用したくない場合は、あなただけのvbcrlfsを挿入することができます。 ">"の後に数字が続く場合を除いて、すべての ">"はvbcrlfの後に続く必要があります。その文字列から新しいxmlファイルを作成します。新しい行とインデントが追加されました。 MSACCESS VBA:

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

質問はjs(var vs dim)についてです... vbaでは明示的にオプションを使うことを検討します。他の人がそれを探している場合には、以下のことが私にとって役に立ちました:http://www.vb-helper.com/howto_formatted_xml_document.html –

関連する問題