C# 用C语言搜索XML#
我有一个xml,我想在C#中搜索并返回一个子节点 比如说C# 用C语言搜索XML#,c#,xml,C#,Xml,我有一个xml,我想在C#中搜索并返回一个子节点 比如说 <STOCK> <STOCKNAME name="Microsoft"> <STOCKSYMBOL>MSFT</STOCKSYMBOL> </STOCKNAME> <STOCKNAME name="Apple Inc."> <STOCKSYMBOL>AAPL</STOCKSYMBO
<STOCK>
<STOCKNAME name="Microsoft">
<STOCKSYMBOL>MSFT</STOCKSYMBOL>
</STOCKNAME>
<STOCKNAME name="Apple Inc.">
<STOCKSYMBOL>AAPL</STOCKSYMBOL>
</STOCKNAME>
<STOCKNAME name="Google">
<STOCKSYMBOL>GOOG</STOCKSYMBOL>
</STOCKNAME>
</STOCK>
提前感谢。“搜索XML”的最佳方法是使用XPath和/或XQuery。这在C#(和所有.Net语言)中都得到了完全支持
以下是一些例子:
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的东西,它是(许多解析器都支持的)
您可以将代码简化为:
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"
我同意其他海报上的观点,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#的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变化不大,它就可以正常工作。您考虑过使用Linq2Xml吗?使用Linq更直观。如果这是一个个人项目,并且您不受限制,那么您应该使用LINQtoXMLI,我会试试这个。任何方向都是感激的。我是新来的。一旦你找到了一个能让你走上适合你的道路的答案,别忘了接受它。股票只是我将要搜索的一个字符串。ie“Microsoft”谢谢,我也会试试。XPath和Linq到Xml都是很好的方法。XPath更为老派,您将看到许多.net示例转移到Linq到Xml。我更喜欢XPath,因为我老了。不用担心,谢谢你的帮助。你让我想到了一些问题,因为我也是一名JAva程序员,所以不必道歉:)我也会尝试这种方法。谢谢
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;
}
}