Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用缩进保存MSXML2.dom文档?(我认为它使用MXXMLWriter)_Javascript_Jscript_Wsh_Msxml6 - Fatal编程技术网

Javascript 如何使用缩进保存MSXML2.dom文档?(我认为它使用MXXMLWriter)

Javascript 如何使用缩进保存MSXML2.dom文档?(我认为它使用MXXMLWriter),javascript,jscript,wsh,msxml6,Javascript,Jscript,Wsh,Msxml6,我有一个MSXML2.DomDocument的实例 我挥手保存它,缩进 此代码有效,但不缩进: var dom = new ActiveXObject("MSXML2.DomDocument"); // fiddle with dom here dom.save(filename); 我想我可以使用MXXMLWriter对象来注入缩进 怎么做 应该这样做 function saveDomWithIndent(dom, filename) { var writer = new Acti

我有一个MSXML2.DomDocument的实例

我挥手保存它,缩进

此代码有效,但不缩进:

var dom = new ActiveXObject("MSXML2.DomDocument");
// fiddle with dom here
dom.save(filename);
我想我可以使用MXXMLWriter对象来注入缩进

怎么做

应该这样做

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=新的ActiveXObject(“MSXML2.DomDocument”);
Indent.async=false;
Indent.resolveExternals=false;
load(“Indent.xsl”);
var Doc=新的ActiveXObject(“MSXML2.DomDocument”);
Doc.async=false;
Doc.resolveExternals=false;
Doc.load(“dirty.xml”);
使用(新的ActiveXObject(“ADODB.Stream”)){
Charset=“utf-8”;
Open();
WriteText(文档转换节点(缩进));
SaveToFile(“pretty.xml”,adSaveCreateOverWrite);
Close();
}
indent.xsl



;

;

如果不想使用xsl,可以插入VBCRLF。 每个“>”都应该跟在vbcrlf后面,除非“>”后面跟一个数字。然后从该字符串创建新的xml文件-现在它有了新行和缩进。 msaccess vba:

Dim objDom As DOMDocument
Set objDom = CreateObject("MSXML2.DOMDocument")
使用objDom.append创建文档,然后使用字符串(我的xml只有数字):

ss=objectDom.XML
对于i=1至Len(ss)
c=Mid(ss,i,1)
如果InStr(1,Mid(ss,i,1),“>”>0,则
a=Asc(中间(ss,i+1,1))
如果a<48或a>57,则
ss1=Mid(ss,1,i)
ss2=Mid(不锈钢,i+1,透镜(不锈钢))
ss=Mid(ss,1,i)和vbCrLf&Mid(ss,i+1,Len(ss))
如果结束
如果结束
接下来我
objDom.loadxmlss
保存(文件路径)

不错。这就引出了下面的问题——我可以使用内置XSL(msxml6.dll中嵌入的XSL表之一)来执行缩进吗?我想有必要以编程方式提取XSL,然后应用它。@非常抱歉,我不完全理解您的意思。实际上,我正在使用
freethreadedomdocument
实例作为静态对象,它存储在应用程序作用域中(在
Application\u OnStart
事件上初始化)。这可以防止每次转换的重复事务。我知道这是一个过时的评论流,但是。。。为了解释我之前的意思:我认为msxml至少包含一个内置XSLT。看,我问的原因是,如果我可以使用内置xslt,而不是嵌入自己的自定义工作表,那会更简单。@Cheeso抱歉,我终于明白了。是的,那太好了。谢谢问题是关于js(var vs dim)。。。在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)