调用SaveToFile时XMLDocument将XML序言拆分为两行的问题排查
问题解答
这不是软件bug,是你操作方式的问题,同时也是XML处理库的正常行为。
原因说明
- XML规范中,
<?xml...?>是文档声明,<?xml-stylesheet...?>是处理指令(PI),二者属于独立的节点。XML处理库在保存文档时,会按自身格式化规则输出这些节点,默认每个节点单独占一行——这完全符合XML规范,因为XML对换行、空白不敏感,这种拆分不会影响文档的解析和功能。 - 你先用
TStringList直接修改文件文本,把两个节点硬凑在同一行,但当重新加载XML文档并调用SaveToFile时,XML库会按照对象模型的结构重新生成文本,不会保留你手动拼接的行格式,因此会把两个节点拆分开。
正确做法
不要通过修改文本行的方式添加处理指令,应该直接通过XML文档对象的API操作,既符合规范,也能避免后续保存时的格式重置。
示例代码(Delphi):
const XML_Template = 'Invoice_%s.xml'; var inv: IXMLInvoiceWood; XMLFile: string; pi: IXMLProcessingInstruction; begin XMLFile := format(XML_Template, ['ABC-123']); inv := NewInvoiceWood; // 创建并添加xml-stylesheet处理指令 pi := inv.OwnerDocument.CreateProcessingInstruction( 'xml-stylesheet', 'href="InvoiceWoodV2R31_Build20081207.xsl" type="text/xsl"' ); // 将处理指令插入到XML声明之后、根节点之前 inv.OwnerDocument.ChildNodes.Insert(0, pi); inv.OwnerDocument.SaveToFile(XMLFile); // 后续加载保存也会保持正确的节点结构 inv := LoadInvoiceWood(XMLFile); inv.OwnerDocument.SaveToFile(XMLFile); mmo1.Lines.LoadFromFile(XMLFile); end;
这样操作后,即使保存时处理指令被拆分成两行,也是完全正常的XML格式,不会影响文档的使用。
内容的提问来源于stack exchange,提问作者larand
相关产品推荐
相关产品推荐

