Delphi 在OmniXML中的NodeAttributes中添加换行符

Delphi 在OmniXML中的NodeAttributes中添加换行符,delphi,delphi-7,omnixml,Delphi,Delphi 7,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

我有一个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>
<links>
    <item>http://www.somelink1.com</item>
    <item>http://www.somelink2.com</item>
    <item>http://www.somelink3.com</item>
</links>

OmniXML不提供输出格式的细粒度控制。您也许可以寻找一个外部XML漂亮的打印机,它可以满足您的需要。或者您甚至可以编写自己的XML库

在进一步讨论之前,我想指出一点,XML从来都不是供人类阅读的。它的设计并不力求可读,如果您继续尝试使XML尽可能可读,那么您将逆流而上。如果您想要一种人类可读的结构化文件格式,那么您可以看看YAML,它的设计就是考虑到了这一点

另一个要考虑的途径是XML的结构。使用节点属性指定值数组是一个糟糕的决定。属性用于名称/值映射对。如果要指定一个值数组,可以这样做:

<xml version="1.0" encoding="UTF-8">
  <Links
  link1="http://www.somelink1.com" 
  link2="http://www.somelink2.com"
  link3="http://www.somelink3.com" 
  />
</xml>
<links>
    <item>http://www.somelink1.com</item>
    <item>http://www.somelink2.com</item>
    <item>http://www.somelink3.com</item>
</links>

当然,如果您以外的人正在定义XML的格式,那么所有这些都是没有意义的。

所以最好不要在属性中添加任何类似的内容?问问自己如何解析这些链接。当为True时,您必须编写一个
循环,形成属性名
'link'+IntToStr(i)
,检查该属性是否存在。如果是这样,读它,如果不是,打破循环。此外,该结构不透明,XML工具(转换等)无法理解。