我有一个XML文件,我需要在Delphi XE2中读取,使用XPath查找一些节点,然后操作这些节点。输入XML文件使用属性值周围的单引号。当我调用SaveToFile时,XML文件现在有双引号而不是属性值周围的单引号。我知道在XML规范中,单引号和双引号无关紧要,只要它们匹配即可。然而,这会导致两个问题:1)读取XML文件的第三方程序不喜欢双引号和2)Diffs读起来很麻烦。
当我调用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的不同对象的注释和建议也很受欢迎。代码似乎太拼凑了我。
答案 0 :(得分:0)
上述注释显然在技术上是正确的:“读取XML文件的第三方程序”实际上不符合XML规范,并且可以使用支持XML的diff
来避免diff
个问题。但是我怀疑OP无法进行有效的投诉,并且不具备相关的diff
。
我看到两个合理的解决方法,都涉及脚本。
第一个建议是黑客。在执行sed -e s/"/'/g
之前,只需通过diff
运行您的 XML输出。关键是有效的XML中除了属性值周围的标记外,没有"
标记,因此,假设保存符合XML的程序就可以了。
第二个建议是在使用readxml | savexml
之前,先使用XML程序通过diff
来运行原始 XML,再执行fullTextEntityManager
.createIndexer(XYZ.class)
.batchSizeToLoadObjects(500).cacheMode(CacheMode.IGNORE).threadsToLoadObjects(2).idFetchSize(Integer.MIN_VALUE)
.startAndWait();
,再次依靠您的XML程序正确完成工作。