如何使用缩进保存MSXML2.DomDocument? (我认为它使用MXXMLWriter)

时间:2012-06-21 18:11:09

标签: javascript jscript wsh msxml6

我有一个MSXML2.DomDocument的实例。

我挥动来保存它,并缩进。

此代码有效,但不会缩进:

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

我想我可以使用MXXMLWriter对象来注入缩进。

如何?

3 个答案:

答案 0 :(得分: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 :(得分: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>

答案 2 :(得分:-1)

如果您不想使用xsl,则只需插入vbcrlfs即可。 每个“&gt;”应该遵循vbcrlf,除非“&gt;”之后是一个数字。然后从该字符串创建新的xml文件 - 现在它有新的行和缩进。 msaccess vba:

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

用objDom.append创建文档,然后用字符串播放(我的xml只有数字):

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)