2009-03-10 2 views
4

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

<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.

ответ

2

псевдокод: myDoc.selectSingleNode ("// Вопрос [@ ид = все, что]") (только довершение моя голова)

1

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

+0

Я ограничен .NET 2.0, а также ... – 2009-03-10 15:05:18

+0

@OliverS: добавьте это ограничение на свой вопрос. – NotMe

+0

Я думаю, что его вопрос был подходящим, поскольку он уточнил, что он хочет, не нужно предлагать что-то вне сферы действия вопроса. – Pat

3

Eyeballing его без компиляции:

XmlNode узел = myDoc.SelectSingleNode ("Data/Вопрос [@ ID = '1']/ответ"); Response.Write ("Ответ:" + node.InnerText);

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

+0

Да, это хорошо компилируется, я пытаюсь сделать то же самое. var node = doc.SelectSingleNode ("/ Data/Question [@ id = '1']/Answer"); Response.Write ("Ответ:" + node.InnerText); –

2

До 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; 
0

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

Смежные вопросы