2015-04-15 1 views
0

Я получаю строку от string GetXmlString(); это я не могу изменить.Избегайте xml экранирования угловых скобок, передавая xml строку в System.Xml.Linq.XElement

Я должен добавить это в xml в пределах new XElement ("parent" , ...);, к области ....

Эта строка, которую я получаю, имеет следующий формат.

<tag name="" value =""></tag> 
<tag name="" value =""></tag> 
<tag name="" value =""></tag> 
... 

Конечный результат я хочу, чтобы это было как

<parent> 
<tag name="" value =""></tag> 
<tag name="" value =""></tag> 
<tag name="" value =""></tag> 
<tag name="" value =""></tag> 
<tag name="" value =""></tag> 
... 
</parent> 

, когда я просто передать строку как XElement("root", GetXmlString()) < и > закодированы &lt; и &gt

Когда я пытаюсь XElement.Parse(GetXmlString()) или XDocument.Parse(GetXmlString()) Я получаю Существует несколько элементов корня исключение.

Как получить требуемый выход без выхода из скобок? Что мне не хватает?

+2

Это не «кодировка ASCII» - это экранирование XML. –

ответ

5

Самый простой вариант, вероятно, чтобы дать это корневой элемент, а затем разобрать его как XML:

var doc = XDocument.Parse("<parent>" + text + "</parent>"); 

Если вам нужно добавить к существующему элементу, вы можете использовать:

var elements = XElement.Parse("<parent>" + text + "</parent>").Elements(); 
existingElement.Add(elements); 
+1

Мой вопрос был немного обманчивым. Я сделал небольшое редактирование. Я должен придерживаться окончательного формата результата. кроме того, есть также и элементы multipe 'parent'. Ваше решение добавляет еще один элемент 'root' в элемент« parent »? –

+1

@DanDole: Нет, это не так - у него не было элемента «parent» вообще. Все, что вам нужно было сделать, это изменить «root» на «parent», и у вас есть полные результаты. Нет необходимости в 'новом XElement (« parent », ...)' вообще, если вам не нужно добавлять его в * существующий * элемент, который все еще прост, но из вашего вопроса неясно, что вам на самом деле нужно. –

2

Альтернативой предложению Джона было бы создать XmlReader для вашего фрагмента и проанализировать его:

var element = new XElement("parent"); 

var settings = new XmlReaderSettings 
{ 
    ConformanceLevel = ConformanceLevel.Fragment 
}; 

var text = GetXmlString(); 

using (var sr = new StringReader(text)) 
using (var xr = XmlReader.Create(sr, settings)) 
{ 
    xr.MoveToContent(); 

    while (!xr.EOF) 
    { 
     var node = XNode.ReadFrom(xr); 
     element.Add(node); 
    } 
} 

Это было бы полезно, если бы «родительский» элемент уже существовал, иначе простая конкатенация узлов XML на каждом конце и синтаксический анализ были бы проще.