在 OmniXML 的 NodeAttributes 中添加换行符
Adding line break in NodeAttributes in OmniXML
我有一个 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;
我希望每个 link 像这样单独一行:
<xml version="1.0" encoding="UTF-8">
<Links
link1="http://www.somelink1.com"
link2="http://www.somelink2.com"
link3="http://www.somelink3.com"
/>
</xml>
OmniXML 不提供对输出格式的这种细粒度控制。您或许可以寻找一台外部 XML 漂亮的打印机来满足您的需求。或者您甚至可以编写自己的 XML 库。
在你继续之前,我想指出一点,XML 从未打算被人类阅读。它的设计没有努力提高可读性,如果您继续尝试使您的 XML 尽可能可读,那么您将逆流而上。如果您想要一种人类可读的结构化文件格式,那么您可能会考虑考虑到这一点而设计的 YAML。
另一个需要考虑的途径是 XML 的结构。使用节点属性来指定值数组是一个糟糕的决定。属性旨在与 name/value 映射对一起使用。如果你想指定一个值数组,那么你可以这样做:
<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 的格式,那么所有这些都没有实际意义。
我有一个 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;
我希望每个 link 像这样单独一行:
<xml version="1.0" encoding="UTF-8">
<Links
link1="http://www.somelink1.com"
link2="http://www.somelink2.com"
link3="http://www.somelink3.com"
/>
</xml>
OmniXML 不提供对输出格式的这种细粒度控制。您或许可以寻找一台外部 XML 漂亮的打印机来满足您的需求。或者您甚至可以编写自己的 XML 库。
在你继续之前,我想指出一点,XML 从未打算被人类阅读。它的设计没有努力提高可读性,如果您继续尝试使您的 XML 尽可能可读,那么您将逆流而上。如果您想要一种人类可读的结构化文件格式,那么您可能会考虑考虑到这一点而设计的 YAML。
另一个需要考虑的途径是 XML 的结构。使用节点属性来指定值数组是一个糟糕的决定。属性旨在与 name/value 映射对一起使用。如果你想指定一个值数组,那么你可以这样做:
<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 的格式,那么所有这些都没有实际意义。