我有一个想要搜索的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;
}
}
提前谢谢。
答案 0 :(得分:4)
我不会称之为“错误”,因为你可以做到这一点,但绝对不是最好的方法。你本质上会重写一些名为XPath的东西built into the .net framework(并且是许多解析器支持的W3C spec)
您可以将代码缩减为:
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"
答案 1 :(得分:3)
“搜索XML”的最佳方法是使用XPath和/或XQuery。 C#(以及所有.Net语言)完全支持这一点。
以下是一些例子:
答案 2 :(得分: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();
答案 3 :(得分:0)
我同意其他海报,XPath和面向文档的方法是更好的方法,但为了理解你编写的代码,我们走了:
当您点击与您正在寻找的公司匹配的元素时,您需要前进到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#的Java主义道歉。)
我更喜欢面向文档的解决方案的原因是您可以加载XML一次并多次查询(对于许多股票,在您的情况下)。使用XmlTextReader,您只需通过该文件一次。
答案 4 :(得分: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变化不大,它就可以正常工作。