簡體   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