2013-05-24 4 views
4

У меня есть несколько текстовых строк, которые содержат хорошо сформированный XML.строка в xmlNode delphi (или как добавить фрагмент xml в TXMLDocument)

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

Это не представляется возможным?

Есть ли какой-либо простой способ добиться чего-то эквивалентного? Моя первоначальная мысль заключалась в том, чтобы использовать свойство IXMLNode.XML (string) и вставить новые строки. Нет такой удачи, как 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-ресурсе, пожалуйста)?

Спасибо!

ответ

2

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

Update: Например:

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); 
+0

Возможно, это единственный путь. Можете ли вы предоставить мне простой пример? – sse

+0

Просто fyi, я попробовал себя, но get 'Property или Method "importNode" не поддерживается DOM Vendor "MSXML"' – sse

+0

Вот код, который я пробовал: currProgNode.DOMNode.ownerDocument.importNode (lclXMLObj.Node.DOMNode ,правда); (где lclXMLObj имеет тип TXMLDocument, а currProgNode имеет тип IXMLNode, в основном пытается скопировать узлы в XML Docs, как было предложено). Я действительно чувствую, что это должно быть намного проще. Надеюсь, я упустил что-то очевидное. Еще раз спасибо. – sse

0

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

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

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

+0

Спасибо. Это удивительно простой подход, к сожалению, я ограничен непосредственно TXMLDocument или MSXML. Любые другие мысли? – sse

+0

Я вижу, что вы нашли решение. Это, к сожалению, единственный жизнеспособный способ в вашем случае. Vanila XML настолько неуклюж для работы, поэтому я создал SimpleStorage. Когда у меня будет некоторое время, я планирую расширить его и сделать его совместимым практически с любым структурированным хранилищем там :) – Runner