我有一个XML,其中我有一个节点的几个属性:
var
row : IXMLNode;
rowattr : IXMLAttr;
xml : IXMLDocument;
begin
xml := ConstructXMLDocument('xml');
SetNodeAttr(xml.DocumentElement, 'version', '1.0');
SetNodeAttr(xml.DocumentElement, 'encoding', 'UTF-8');
row := AppendNode(xml, 'Links');
rowattr:=xml.CreateAttribute('Link1');
rowattr.Value:='http:\\wwww.somelink1.com';
row.Attributes.SetNamedItem(rowattr);
rowattr:=xml.CreateAttribute('Link2');
rowattr.Value:='http:\\wwww.somelink2.com';
row.Attributes.SetNamedItem(rowattr);
rowattr:=xml.CreateAttribute('Link3');
rowattr.Value:='http:\\wwww.somelink3.com';
row.Attributes.SetNamedItem(rowattr);
XMLSaveToFile(xml, 'C:\Test1.xml', ofIndent);
end;
我希望将每个链接放在一个单独的行上:
<xml version="1.0" encoding="UTF-8">
<Links
link1="http://www.somelink1.com"
link2="http://www.somelink2.com"
link3="http://www.somelink3.com"
/>
</xml>
答案 0 :(得分:2)
OmniXML不提供输出格式的细粒度控制。您可能希望找到一个可以满足您需求的外部XML漂亮打印机。或者你甚至可以编写自己的XML库。
在你再进一步之前,我想说明XML从未打算被人类阅读。它的设计不遗余力,如果你继续努力使你的XML尽可能可读,那么你将会逆流而上。如果你想要一个人类可读的结构化文件格式,那么你可能会看一下YAML,而YAML就是为此而设计的。
另一个需要考虑的途径是XML的结构。使用节点属性指定值数组是一个糟糕的决定。属性旨在与名称/值映射对一起使用。如果要指定值数组,则可以这样执行:
<links>
<item>http://www.somelink1.com</item>
<item>http://www.somelink2.com</item>
<item>http://www.somelink3.com</item>
</links>
这比XML更清晰,更容易解析。尝试编写代码来解析你的属性,你就会明白我的意思。
现在,为了说明我的观点,在YAML中,这将是:
Links:
- http://www.somelink1.com
- http://www.somelink2.com
- http://www.somelink3.com
当然,如果除了你之外的其他人正在定义XML的格式,那么这一切都没有实际意义。