строка в xmlNode delphi (или как добавить фрагмент xml в TXMLDocument)

У меня есть несколько текстовых строк, содержащих правильно сформированный XML.

Я хотел бы иметь возможность (1) превратить эти строки в IXMLNodes, а затем (2) добавить их к существующему XMLDocument. Желательно без объявления нового XMLDocument.

Это не кажется возможным?

Есть ли простой способ сделать что-то эквивалентное? Моей первоначальной мыслью было использовать свойство IXMLNode.XML (строка) и вставлять новые строки. Не повезло, поскольку IXMLNode.XML доступен только для чтения.

Вот пример, если бы у меня были следующие строки в TStringList,

<Property Name="Version" RttiType="tkString"></Property>
<Property Name="ShowSubunit" RttiType="tkBoolean"></Property>

И у меня был следующий XML, уже загруженный в TXMLDocument, как я мог легко добавить две строки выше в TXMLDocument ниже?

<Program Name="PFOO">
  <Class Name="CFOO">
    <Property Name="DBN" RttiType="tkString"/>
    <Property Name="SDate" RttiType="tkClass" ClassType="TXSDATE">12/30/1899</Property>
    <Property Name="XForm" RttiType="tkEnumeration">xfXML</Property>
    <Property Name="Singleton" RttiType="tkBoolean">True</Property>
  </Class>
</Program>

Любые другие (простые) способы добиться этого (пожалуйста, не используйте защищенный взлом свойства XML)?

Благодарю вас!


person sse    schedule 24.05.2013    source источник


Ответы (2)


Если вы не проанализируете XML-фрагменты вручную, а затем не создадите соответствующие дочерние узлы/атрибуты вручную, вам придется загрузить фрагменты во временный XMLDocument, а затем при необходимости переместить его узлы в основной XMLDocument.

Обновление: Например:

Node := XmlDocument1.DocumentElement.ChildNodes[0]; // <Class> node
Node.ChildNodes.Add(LoadXMLData('<Property Name="Version" RttiType="tkString"></Property>').DocumentElement);
Node.ChildNodes.Add(LoadXMLData('<Property Name="ShowSubunit" RttiType="tkBoolean"></Property>').DocumentElement);
person Remy Lebeau    schedule 25.05.2013
comment
Это действительно может быть единственным выходом. Не могли бы вы привести простой пример? - person sse; 28.05.2013
comment
Просто к сведению, я пробовал сам, но получаю «Свойство или метод importNode не поддерживается поставщиком DOM MSXML» - person sse; 28.05.2013
comment
Вот код, который я пробовал: currProgNode.DOMNode.ownerDocument.importNode(lclXMLObj.Node.DOMNode,true); (где lclXMLObj имеет тип TXMLDocument, а currProgNode имеет тип IXMLNode, в основном пытаясь скопировать узлы в документах XML, как это было предложено). Я действительно чувствую, что это должно быть намного проще. Надеюсь, я упускаю что-то очевидное. Еще раз спасибо. - person sse; 28.05.2013
comment
Вам не нужно переходить на уровень DOM, чтобы перемещать узлы между документами. Просто Add() или Insert() и IXMLNode в ChildNodes другого IXMLNode, и при необходимости он автоматически перейдет к новому документу. Я обновил свой ответ примером. - person Remy Lebeau; 29.05.2013
comment
Спасибо за перенаправление (и ответ!). Я потратил много времени на уровень DOM. - person sse; 29.05.2013

Ознакомьтесь с SimpleStorage. На данный момент он привязан к OmniXML, но он мощный. То, что вы хотите, будет выглядеть так:

CurrentNode.Append(StorageFromXML('<Node>Content</Node>'));

Одна строка кода.

person Runner    schedule 25.05.2013
comment
Спасибо. Это удивительно простой подход, к сожалению, я ограничен непосредственно TXMLDocument или MSXML. Любые другие мысли? - person sse; 28.05.2013
comment
Я вижу, ты нашел решение. К сожалению, это единственный действенный способ в вашем случае. С Vanila XML очень неудобно работать, поэтому я сделал SimpleStorage. Когда у меня будет время, я планирую расширить его и сделать совместимым практически с любым структурированным хранилищем :) - person Runner; 29.05.2013