繁体   English   中英

在C#中搜索XML

[英]Searching XML in 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;
    }
}

先感谢您。

我不会称其为“错误的”,因为您可以完成这项工作,但这绝对不是最佳方法。 从本质上讲,您将重新编写.net框架中内置的 XPath(这是许多解析器支持的W3C规范

您可以将代码简化为:

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"

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

这里有些例子:

使用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();

我同意其他张贴者的观点,认为XPath和面向文档的方法是更好的方法,但是为了理解您编写的代码,我们开始:

当您找到与您要寻找的公司相匹配的Element时,您想前进到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#中的所有Javaism表示歉意。)

我之所以喜欢面向文档的解决方案,是因为您可以一次加载XML并查询多次(对于您的情况而言,对于很多股票)。 使用XmlTextReader,您只能通过该文件一次。

它可能不是很健壮,但我会做些简单的事情:

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变化不大,它就可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM