保存XML文档会将单引号更改为双引号

保存XML文档会将单引号更改为双引号,xml,delphi,xpath,delphi-xe2,Xml,Delphi,Xpath,Delphi Xe2,我需要在DelphiXe2中读取一个XML文件,使用XPath查找一些节点,然后操作这些节点。输入XML文件在属性值周围使用单引号。当我调用SaveToFile时,XML文件现在在属性值周围有双引号而不是单引号。我知道在XML规范中,单引号和双引号并不重要,只要它们是匹配的。但是,这会导致两个问题:1)读取XML文件的第三方程序不喜欢双引号,2)读取差异比较混乱 当我调用SaveToFile时,有没有办法防止单引号变为双引号 尽管我在Delphi方面经验丰富,但我对使用Delphi来处理XML还

我需要在DelphiXe2中读取一个XML文件,使用XPath查找一些节点,然后操作这些节点。输入XML文件在属性值周围使用单引号。当我调用SaveToFile时,XML文件现在在属性值周围有双引号而不是单引号。我知道在XML规范中,单引号和双引号并不重要,只要它们是匹配的。但是,这会导致两个问题:1)读取XML文件的第三方程序不喜欢双引号,2)读取差异比较混乱

当我调用SaveToFile时,有没有办法防止单引号变为双引号

尽管我在Delphi方面经验丰富,但我对使用Delphi来处理XML还是很陌生,因此我可能对我选择使用的对象有点不熟悉。这是我在网上找到的几个例子拼凑而成的

var doc: IXMLDocument;
  Node : IDOMNode;
  Sel: IDOMNodeSelect;
  List : IDOMNodeList;
  j : Integer;
begin
  doc := TXMLDocument.Create(Application);
  doc.LoadFromFile('somefile.xml'); //Input file uses single quotes around    attribute values
  doc.active := True;
  Sel := doc.DOMDocument as IDomNodeSelect;
  List := Sel.selectNodes('//column[not(@hidden=''true'') and @caption]');
  for j := 0 to List[i].childNodes.length-1 do
    List[i].childNodes[0].nodeValue := 'foo';

  doc.SaveToFile('somefile2.xml'); //This is a copy to compare against the original
  //Output file has double quotes around attribute values
end;

对于在Delphi中使用XML和XPath的不同对象的评论和建议也很感激。对我来说,代码似乎过于拼凑。

显然,上述评论在技术上是正确的:“读取XML文件的第三方程序”实际上并不符合XML规范,可以使用支持XML的
diff
来避免
diff
问题。但我怀疑OP没有有效的投诉能力,也没有相关的
diff

我看到两个合理的解决方案,都涉及脚本

第一个建议是黑客攻击。在执行
diff
之前,只需通过
sed-es/“/”/g
运行XML输出。问题是,除了属性值周围的标记外,有效XML中不可能有任何
标记,因此假设保存XML的程序是兼容的,这应该没问题


第二个建议是,在执行
diff
之前,使用您的XML程序通过类似
readxml | savexml
的方式运行原始XML,再次依赖您端的XML程序正确执行其工作。

“有没有办法防止调用SaveToFile时单引号变为双引号?”-不是标准方式,不是。XML标准在解析时可能允许两种类型的引号,但在保存时双引号是事实上的标准。您必须查看底层DOM引擎的功能,以查看它是否公开了任何更改所用引号字符的选项。您需要修复读取XML的程序。如果读取差异比较混乱,那么我希望您没有使用支持XML的差异化工具。