0

C# で子ノードを検索して返したい xml があります。

例えば

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

前もって感謝します。

4

5 に答える 5

4

あなたがそれを機能させることができるので、私はそれを「間違っている」とは言いませんが、それは間違いなく最善のアプローチではありません. 本質的には、.net フレームワークに組み込まれている(多くのパーサーでサポートされているW3C 仕様である) 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"
于 2012-05-08T20:47:14.923 に答える
3

「XML を検索」する最良の方法は、XPath や XQuery を使用することです。これは、C# (およびすべての .Net 言語) で完全にサポートされています。

ここではいくつかの例を示します。

于 2012-05-08T20:43:06.140 に答える
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();
于 2012-05-08T20:46:45.140 に答える
0

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 を 1 回読み込んで、何度もクエリを実行できるからです (この場合は、多数の株式に対して)。XmlTextReader を使用すると、ファイルを 1 回だけ通過できます。

于 2012-05-08T21:04:06.317 に答える
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 が大きく変わらない限り、問題なく動作するはずです。

于 2012-05-08T22:41:13.687 に答える