我有一個MSXML2.DomDocument的實例。如何使用縮進來保存MSXML2.DomDocument? (我認爲它使用MXXMLWriter)
我揮手保存它,並縮進。
此代碼的工作,但不縮進:
var dom = new ActiveXObject("MSXML2.DomDocument");
// fiddle with dom here
dom.save(filename);
我想我可以用一個MXXMLWriter對象注入縮進。
怎麼樣?
我有一個MSXML2.DomDocument的實例。如何使用縮進來保存MSXML2.DomDocument? (我認爲它使用MXXMLWriter)
我揮手保存它,並縮進。
此代碼的工作,但不縮進:
var dom = new ActiveXObject("MSXML2.DomDocument");
// fiddle with dom here
dom.save(filename);
我想我可以用一個MXXMLWriter對象注入縮進。
怎麼樣?
這個oughta做到了。
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);
}
我無法弄清楚如何調整縮進級別。它總是以標籤縮進。
還有另一種美化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>
</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>
</xsl:text>
<xsl:value-of select="substring($indent,3)" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
如果你不想使用XSL,你可以只插入vbcrlfs。 每個「>」應該跟隨vbcrlf,除非「>」後面跟着一個數字。然後從該字符串中創建新的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)
問題是關於js(var vs dim)...在vba中考慮使用顯式選項。以下對我有幫助,以防別人正在尋找它:http://www.vb-helper.com/howto_formatted_xml_document.html –
不錯。這導致了後續問題 - 我可以使用嵌入在msxml6.dll中的XSL表單之一的內置XSL執行縮進嗎?我想有必要以編程方式提取XSL然後應用它。 – Cheeso
@Cheeso對不起,我完全不明白你的意思。實際上,我使用'FreeThreadedDomDocument'實例作爲一個靜態對象,它存儲在使用Classic ASP的Application範圍中(在'Application_OnStart'事件上初始化)。這可以防止每個轉換的重複事務。 –
我知道這是一個陳舊的評論流,但是...解釋我之前的意思:我認爲msxml至少包含一個內置XSLT。請參閱http://stackoverflow.com/questions/9463402/default-xml-stylesheet-in-chrome我問的原因是,如果我可以使用內置的xslt而不是嵌入自己的自定義工作表,那將會更簡單。 – Cheeso