2017-01-10 5 views
1

У меня есть XML, где у меня есть несколько атрибутов для одного узла:Добавление разрыва строки в NodeAttributes в OmniXML

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> 

ответ

2

OmniXML не предлагает такого мелкозернистого управления форматированием вывода. Возможно, вы захотите найти внешний XML-принтер, который будет делать то, что вам нужно. Или вы даже можете написать свою собственную библиотеку XML.

Прежде чем идти дальше, хотя я хотел бы подчеркнуть, что XML никогда не предназначался для чтения людьми. Его дизайн не требует усилий для чтения, и если вы продолжаете пытаться сделать ваш XML максимально читаемым, вы будете плавать против прилива. Если вы хотите, чтобы пользовательский формат структурированного файла был удобен для чтения, вы можете вместо этого взглянуть на 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.

+0

Значит, лучше не добавлять ничего такого в атрибуты? – SovereignSun

+2

Спросите себя, как вы собираетесь разбирать эти ссылки. Вам нужно будет написать цикл while while, сформируйте имя атрибута ''link' + IntToStr (i)', проверьте, существует ли этот атрибут. Если это так, прочитайте, если нет, выйдете из цикла. Кроме того, структура непрозрачна, а инструменты XML (трансформации и т. Д.) Этого не поймут. –