2013-12-05 3 views
0

Я хочу получить одно значение из большой строки XML. У меня есть кое-что строка держит как:Простейший способ получить одно значение из строки XML?

<?xml version="1.0" encoding="utf-8" ?> 
<UserInfo> 
    <User> 
     <First>Alice</First> 
     <Last>Avery</Last> 
     <ID>12345</ID> 
     <Age>25</Age> 
     <OtherThing> 
      <with>stuff</with> 
      <in>it</in> 
     </OtherThing> 
    </User> 
</UserInfo> 

только намного больше и уродливее, и все, что я хочу, чтобы получить это значение ID: «12345». Идентификатор может иметь атрибуты на нем, и они могут отличаться, или я бы, скорее всего, просто выполнил поиск строки с регулярным выражением. Похоже, вы должны сделать что-то подобное только в 2 или 3 строках.

+0

LINQ к XML должен обеспечить простое, простое решение – Seymour

+0

Research XPaths –

+0

возможно дубликат [XML - получить к югу от значения узла] (http://stackoverflow.com/questions/12290214/xml-get-sub-node-value) –

ответ

2

Самый простой способ, на который я думаю: XmlDocument.LoadXml(xmlString) способ.

Так как в указанном примере самой MSDN, вы можете сделать:

XmlDocument doc = new XmlDocument(); 
    doc.LoadXml("<item><name>wrench</name></item>"); 

    doc["item"]["name"].InnerText; //WILL RETURN "wrench" 

Единственное, что я бы обратить Ваше внимание на это, что XmlDocument загружается полностью в памяти и на основании размера этой строки, может стать неэффективным. Так что это зависит от фактического размера данных, на которых вы работаете.

+0

@ FrédéricHamidi: привилегированная ссылка, как обычно, для документов MSDN, также является примером, который подсказывает, как действовать. Кстати отредактированный ответ тоже. – Tigran

+0

Пример в вашей ссылке не показывает, как сопоставить элемент, но ваш ответ теперь делает, поэтому все в порядке. (Кстати, зачем применять 'ToString()' toInnerText', который уже является строкой?) –

+0

@ FrédéricHamidi: typo ... – Tigran

3

Попробуйте это:

var doc = XDocument.Parse(xmlString); 
int id = (int)doc.XPathSelectElement("UserInfo/User/ID"); 
+0

+1, не знал о возможности литья, я всегда использовал «Преобразовать» значение. –

0

SelectSingleNode который принимает выражение XPath в качестве параметра. Вот starter учебник по XPath, это язык на своем собственном и может быть довольно мощным.

1

Если значение ID будет происходить только один раз в xml, может быть проще просто запустить его через регулярное выражение.

<ID.*?>(.*?)</ID> 

Если вам нужно запустить через дерево документа, то вам, возможно, придется разобрать XML, и использовать XPath или что-то, чтобы получить значение.

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 
XmlNode idNode = doc.SelectSingleNode("//UserInfo/User/ID"); 
Console.WriteLine(idNode.InnerText); 
0

Возможно, вы захотите рассмотреть linq-to-xml.

Ниже приводится пример:

var document = XDocument.Parse(“<…/>”); 
var id = document.XPathSelectElement("/UserInfo/User/ID").Value; 

С уважением,

0

Вы можете использовать LINQ для XML.

XDocument doc = XDocument.Parse(XMLstring); 
IEnumerable<string> values = from elem in doc.Descendants("User") select elem.Element("ID").Value; 

Для получения дополнительной информации см. LINQ to XML Overview.

0

Это должно работать также:

class Program 
{ 
    static void Main(string[] args) 
    { 

     XDocument file = XDocument.Load(@"C:\test.xml"); 
     var query = file.Element("UserInfo").Element("User").Element("ID").Value; 
     Console.WriteLine(query); 
     Console.ReadKey(); 


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