XML C # Быстрый способ найти узел - PullRequest
4 голосов
/ 10 марта 2009

Привет, я новичок в XML и .NET. Мне было интересно, как я могу разобрать следующий файл. Я хочу иметь возможность получить XmlNode на основе идентификатора, который я предоставлю. Пример:

<Data>
<Question id="1">
<Answer>ddd</Answer>
</Question>
</Data>

Я хочу как-нибудь это сделать:

XmlDocument myDoc = new XmlDocument();
XmlElement myElem = myDoc.GetElementById("1");
Response.Write("Answer: "+myElem.ChildNodes[0].InnerXML);

Это должно дать мне вывод: "Ответ: DDD".

Любая помощь очень ценится, спасибо.

Также я бы предпочел не использовать LINQ, так как я хотел бы сначала освоить XML-компонент .NET.

Ответы [ 5 ]

3 голосов
/ 10 марта 2009

Глазное яблоко без компиляции:

XmlNode node = myDoc.SelectSingleNode ("Данные / Вопрос [@ id = '1'] / Ответ"); Response.Write ("Ответ:" + node.InnerText);

Конечно, изменение 1 в качестве параметра было бы идеальным, если вы хотите что-то переменное.

2 голосов
/ 10 марта 2009

До LINQ я бы использовал SelectSingleNode с запросом XPath. В приведенном выше примере XPath будет выглядеть примерно так: "//Question[@id=1]/Answer". Теперь я бы использовал LINQ, потому что, по крайней мере, я так понимаю, вы экономите накладные расходы, не работая с объектом XmlDocument. Используя XElement и используя метод расширения LINQ to XML, чтобы запросить его для нужного вам узла, вы можете выполнить все это в одной или двух строках кода, и он будет работать как хорошо или лучше.

Вот пример одной строки в LINQ, использующей ваш фрагмент XML, который даже не требует создания экземпляра объекта для работы с XML:

string xml = "<Data><Question id=\"1\"><Answer>ddd</Answer></Question></Data>";
string answer = XElement.Parse(xml).Descendants("Question").
    Where(node => node.Attribute("id").Value == "1").
    Descendants("Answer").ElementAt(0).Value;
2 голосов
/ 10 марта 2009

псевдокод: myDoc.selectSingleNode ("// Вопрос [@ id = что-либо]") (просто с моей головы)

1 голос
/ 10 марта 2009

Компонент XML в .Net был дерьмом. Пожалуйста, не подвергайте себя этому, а просто переходите на LINQ to XML. Судя по всему, с ним намного проще работать, и он работает быстрее.

0 голосов
/ 10 марта 2009

Я думаю, что те, кто указывает вам на Linq и вдали от компонентов XML, верны. Вы можете изучить или использовать XPath для несовместимости с .Net, и Linq позволяет вам делать это, если хотите. С компонентами XML работать не весело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...