Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言搜索XML#_C#_Xml - Fatal编程技术网

C# 用C语言搜索XML#

C# 用C语言搜索XML#,c#,xml,C#,Xml,我有一个xml,我想在C#中搜索并返回一个子节点 比如说 <STOCK> <STOCKNAME name="Microsoft"> <STOCKSYMBOL>MSFT</STOCKSYMBOL> </STOCKNAME> <STOCKNAME name="Apple Inc."> <STOCKSYMBOL>AAPL</STOCKSYMBO

我有一个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>
提前感谢。

“搜索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的东西,它是(许多解析器都支持的)

您可以将代码简化为:

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;
    }
}