【问题标题】:Inno Setup: Save XML document with indentationInno Setup:使用缩进保存 XML 文档
【发布时间】:2016-04-04 16:29:58
【问题描述】:

我正在尝试在 Inno Setup 中向 XML 文件添加一个新节点。节点添加正确,但下一个标记之前的换行符被删除或未添加换行符。 这是我添加节点的代码:

NewNode := XMLDoc.createElement('Test');
XMLDoc.setProperty('SelectionLanguage', 'XPath');
RootNode := XMLDoc.selectSingleNode('//Configuration/AppSettings');
RootNode.appendChild (NewNode);
RootNode.lastChild.text :='New Node';

这是我的 XML 文件:

<Configuration>
    <AppSettings Name="General Settings">
        <StartTime/>
        <StopTime/>
        <TimeBetweenTests>30</TimeBetweenTests>
        <Port>600</Port>
        <Test>New Node</Test></AppSettings>
</Configuration>

我期待标签

</AppSettings>

在添加新节点之前保持在换行符中。 如何添加换行符以使格式更具可读性?

【问题讨论】:

    标签: xml inno-setup pascalscript


    【解决方案1】:

    您可以使用MXXMLWriter class 进行格式化:

    procedure SaveXmlDocumentWithIndent(XmlDocument: Variant; FileName: string);
    var
      Writer: Variant;
      Reader: Variant;
      FSO: Variant;
      TextStream: Variant;
    begin
      Writer := CreateOleObject('Msxml2.MXXMLWriter');
      Reader := CreateOleObject('MSXML2.SAXXMLReader');
      FSO := CreateOleObject('Scripting.FileSystemObject');
      TextStream := FSO.CreateTextFile(FileName, True);
      Writer.Indent := True;
      Writer.OmitXMLDeclaration := True;
      Reader.ContentHandler := Writer;
      Reader.Parse(XmlDocument);
      TextStream.Write(Writer.Output);
      TextStream.Close();
    end;
    

    致谢:@cheeso 对How can I save an MSXML2.DomDocument with indenting? (I think it uses MXXMLWriter) 的回答。
    我刚刚用 Pascal Script 重新实现了他的 JavaScript 代码。


    上述解决方案将根据MXXMLWriter类的喜好重新格式化完整的XML文档。

    如果你想保留你选择的某种格式,你必须通过添加你想要的缩进来明确地实现它。

    要在添加的节点之后添加新行 (#13#10 = CRLF) 并使用制表符 (#9) 缩进结束父标记,请使用:

    RootNode.appendChild(XMLDoc.createTextNode(#13#10#9));
    

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多