[英]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.