2012-05-08 2 views
0

У меня есть xml, который я хочу найти и вернуть дочерний узел в C#.Поиск XML в C#

Например

<STOCK> 
    <STOCKNAME name="Microsoft">  
     <STOCKSYMBOL>MSFT</STOCKSYMBOL> 
    </STOCKNAME> 
    <STOCKNAME name="Apple Inc.">   
     <STOCKSYMBOL>AAPL</STOCKSYMBOL> 
    </STOCKNAME> 
    <STOCKNAME name="Google">   
     <STOCKSYMBOL>GOOG</STOCKSYMBOL> 
    </STOCKNAME> 
</STOCK> 

Если я передать строку Microsoft, я хочу, чтобы получить прибыль только MSFT. Я думаю, что я делаю это неправильно

String stockText = ""; 
XmlTextReader reader = new XmlTextReader(@"C:\xml\stockname2.xml"); 

while (reader.Read()) 
{ 
    switch (reader.NodeType) 
    { 
     case XmlNodeType.Element: 
      break; 

     case XmlNodeType.Text: 
      if (reader.GetAttribute("name") == stock) 
      { 
       stockText = reader.GetAttribute("symbol"); 
      } 
      break; 
    } 
} 

Заранее спасибо.

+3

Вместо этого вы решили использовать Linq2Xml? Используя Linq, это гораздо более интуитивно понятно. – walther

+0

Если это персональный проект, и вы не ограничены, вы должны использовать Linq для Xml – BrokenGlass

+0

Я попробую это. Любое направление приветствуется. Я новичок в этом. – user1383056

ответ

2

Использование Linq2Xml

string searchFor="Microsoft"; 
XDocument xDoc = XDocument.Load(.....); 

var result = xDoc.Descendants("STOCKNAME") 
    .Where(x=>x.Attribute("name").Value==searchFor) 
    .Select(x=>x.Element("STOCKSYMBOL").Value) 
    .SingleOrDefault(); 
+0

Удаленный мой, обновленный ваш, у меня было несколько ошибок. – Tesserex

+0

Не беспокойтесь, спасибо за помощь. У вас есть мысли, думающие о некоторых conecpts. – user1383056

4

I ш ouldn't называет это «неправильным», потому что вы можете сделать эту работу, но это определенно не лучший подход. Вы бы в сущности быть переписывание то, что называется XPath, которое built into the .net framework (и это W3C spec поддерживается многими анализаторами)

Вы можете уменьшить свой код, чтобы что-то вроде:

var doc = new XmlDocument(); 
doc.Load(@"C:\xml\stockname2.xml"); 

var node = doc.SelectSingleNode("//STOCK/STOCKNAME[@name = 'Microsoft']/STOCKSYMBOL"); 
string symbol = node.InnerText; // this should be "MSFT" 
+0

Спасибо, я тоже попробую. – user1383056

+0

XPath и Linq to Xml - оба хороших подхода. XPath - более старая школа, и вы увидите много примеров .net, перемещающихся в Linq в Xml. Я предпочитаю XPath, потому что хорошо, я стар. – dkackman

0

Я согласен с другими плакатами что XPath и документ-ориентированный подход - лучший способ пойти, но для понимания кода, который вы написали, здесь мы идем:

Когда вы нажмете элемент, который соответствует компании, которую вы ищете, вы затем хотите, чтобы продвигался в текстовый узел и получите его значение. Что-то вроде этого:

while (reader.Read()) 
    { 
     switch (reader.NodeType) 
     { 
      case XmlNodeType.Element: 
       if (reader.GetAttribute("name") == stock) 
       { 
        if (reader.Read() && reader.NodeType == XmlNodeType.Text) 
        { 
         stockText = reader.Value; 
        } 
       } 
       break; 
     } 
    } 

(. Извинения для любых Javaisms, которые вкрались в моей C#)

Причина, по которой я предпочитаю документ-ориентированных решений является то, что вы можете загрузить XML один раз и запросить его много раз (для многих акций, в вашем случае). С помощью XmlTextReader вы получаете только один проход через файл.

+0

Смотрите, я тоже программист JAva, поэтому не нужно извиняться :) Я тоже попробую этот подход. благодаря – user1383056

0

Это, вероятно, не очень надежен, но я хотел бы сделать что-то же просто, как это:

String stock = "Microsoft"; 
String stockText = ""; 
XmlTextReader reader = new XmlTextReader(@"C:\xml\stockname2.xml"); 

while(reader.ReadToFollowing("STOCKNAME")) 
{ 
    if(reader.GetAttribute("name") == stock) 
    { 
     reader.ReadToDescendant("STOCKSYMBOL"); 
     stockText = reader.ReadElementContentAsString(); 
     break; 
    } 
} 

Пока ваш XML не сильно отличается, он должен работать нормально.