在C#中搜索XML

时间:2012-05-08 20:39:28

标签: c# xml

我有一个想要搜索的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;
    }
}

提前谢谢。

5 个答案:

答案 0 :(得分:4)

我不会称之为“错误”,因为你可以做到这一点,但绝对不是最好的方法。你本质上会重写一些名为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"

答案 1 :(得分:3)

“搜索XML”的最佳方法是使用XPath和/或XQuery。 C#(以及所有.Net语言)完全支持这一点。

以下是一些例子:

答案 2 :(得分: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();

答案 3 :(得分:0)

我同意其他海报,XPath和面向文档的方法是更好的方法,但为了理解你编写的代码,我们走了:

当您点击与您正在寻找的公司匹配的元素时,您需要前进到Text节点并获取值。像这样:

    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;
        }
    }

(对于任何悄悄进入我的C#的Java主义道歉。)

我更喜欢面向文档的解决方案的原因是您可以加载XML一次并多次查询(对于许多股票,在您的情况下)。使用XmlTextReader,您只需通过该文件一次。

答案 4 :(得分: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变化不大,它就可以正常工作。