2016-09-26 10 views
0

Например, у меня есть XML-строка:Как получить InnerText и InnerXml узла из XmlDocument?

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <text>How to get <bold>all</bold> this string's content?</text> 
</data> 

Я хочу, чтобы получить все эти элементы в массиве объектов (для каждого объекта у меня есть класс), без потери их структур:

[1] (TextClass; where bold = false) How to get 
[2] (TextClass; where bold = true) all 
[3] (TextClass; where bold = false) this string's content? 

Все, что я получаю, используя классы XmlDocument и XmlNode, прямо сейчас - это InnerText или InnerXml отдельно.

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load("example.xml"); 
foreach (XmlNode child in xmlDoc.DocumentElement.ChildNodes) 
{ 
    string chName = child.Name; // text 
    string text = child.InnerText; // How to get all this string's content? 
    string xml = child.InnerXml; // How to get <bold>all</bold>this string's content? 
} 

Возможно ли это?

+0

Что вы на самом деле спрашиваете здесь? У тебя есть дети. Что вам не хватает? Итерации через «ChildNodes» и соответственно создайте свои собственные экземпляры классов. Добавьте их в список «» или что-то еще. Или используйте LINQ. –

+0

@EdPlunkett Что я пытаюсь архивировать, так это то, что я хочу получить последовательность текста, в которой у меня может быть XmlNode, который указывает, что этот текст стилизован. Итерацией бросая дочерние узлы я потеряю эту последовательность, потому что я получу текст и стилизованный текст отдельно друг от друга. –

+0

Какая последовательность текста? Что случилось с тем, что у вас есть? Можете ли вы показать мне пример последовательности дочерних узлов, которые выглядят не по порядку в «ChildNodes»? Что значит «отдельно друг от друга»? –

ответ

1

Для такого рода работ я считаю, что проще использовать LINQ to XML.

В вашем примере что-то вроде следующего может работать (в зависимости от того, что именно вы хотите достичь):

XDocument doc = XDocument.Parse(xml); 
var textClasses = from n in doc.Descendants("text").DescendantNodes() 
        where n.NodeType == XmlNodeType.Text 
        select new { text = ((XText)n).Value, bold = n.Parent?.Name == "bold" }; 

И .net fiddle так что вы можете быстро увидеть результат.