0

我有一个要在 C# 中搜索并返回子节点的 xml。

例如

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

先感谢您。

4

5 回答 5

4

我不会称其为“错误的”,因为您可以做到这一点,但这绝对不是最好的方法。本质上,您将重写称为 XPath 的东西,它内置于 .net 框架中(并且是许多解析器支持的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"
于 2012-05-08T20:47:14.923 回答
3

“搜索 XML”的最佳方式是使用 XPath 和/或 XQuery。这在 C#(和所有 .Net 语言)中得到完全支持。

这里有些例子:

于 2012-05-08T20:43:06.140 回答
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();
于 2012-05-08T20:46:45.140 回答
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 变化不大,它就可以正常工作。

于 2012-05-08T22:41:13.687 回答
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;
        }
    }

(对于潜入我的 C# 的任何 Javaisms 表示歉意。)

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

于 2012-05-08T21:04:06.317 回答