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