0

私は次のようなxmlドキュメントを持っています:

<Menu>
    <Category name="Comida Rapida">
        <Food cocina="si">
            <Name>Haburguesa</Name>
            <Price>10</Price>
        </Food>
        <Food>
            <Name>Papas Fritas</Name>
            <Price>20</Price>
        </Food>
    </Category>
    <Category name="Bebidas">
        <Food>
            <Name>Pepsi</Name>
            <Price>30</Price>
        </Food>
        <Food cocina="si">
            <Name>Coca Cola</Name>
            <Price>40</Price>
        </Food>
    </Category>
</Menu>

私がやりたい<Category>のは、属性が必要なものであるかどうかを確認することです。たとえば、「Bebidas」などです。したがって、関心のある部分は次のとおりです。

<Food>
    <Name>Pepsi</Name>
    <Price>30</Price>
</Food>
<Food cocina="si">
    <Name>Coca Cola</Name>
    <Price>40</Price>
</Food>

これができたので、すでに行ったことと同様のことをしたいと思います。

まず、すべてを印刷したいと思います。

Pepsi 30
Coca Cola 40

そして、私は食べ物が属性を持っていたものだけを印刷したいcocina="si"ので、:

Coca Cola 40

だから私はさまざまな質問があります:

まず、どのアプローチを使用するか、XmlDocument、XmlReader、XmlTextReaderなどの可能なメソッドと実装が豊富にあることに混乱しています。

この質問から、私はXmlDocumentの方が使いやすく、それは素晴らしい、単純である、ということを収集しました。あなたが理解できるように、私はXmlファイルの解析にまったく慣れていないからです。

さて、実際の実装では、私は多くの成功を収めることなくあらゆる種類のことを試みました。私はいくつかの部分を行うことができるようですが、すべてを一緒に行うことはできません。

XmlNodeList elemList = doc.GetElementsByTagName("Category");
for (int i = 0; i < elemList.Count; i++)
{
    Console.WriteLine(elemList[i].InnerXml);
}

これは出力します:

<Food><Name>Haburguesa</Name><Price>10</Price></Food><Food><Name>Papas Fritas</Name><Price>20</Price></Food>
<Food><Name>Pepsi</Name><Price>30</Price></Food><Food><Name>Coca Cola</Name><Price>40</Price></Food> 

これは理にかなっていますが、カテゴリに属性があるかどうかを確認するにはどうすればよいですname="cocina"か?

私はこのような何かが役立つと思います:

for (int j = 0; j < elemList[i].Attributes.Count; j++)
{
    //??                
}

MoveToAttribute()しかし、XmlTextReaderのようなものは見つかりません。

そして、もう一度、属性があるかどうかを確認するにはどうすればよいですcocina="si"か?

4

3 に答える 3

2

ここでは、LINQtoXMLが最も簡単な方法だと思います。

XDocumentここでクラスを使用する必要があります。静的メソッドを使用してドキュメントオブジェクトを作成しますXDocument.Parse(DOCUMENT)-文字列からドキュメントをロードする-またはXDocument.Load(PATH)-指定されたパスでファイルからドキュメントをロードします。

その後、次のようなクエリで探しているものを簡単に見つけることができます。

var doc = XDocument.Parse("<Menu> ... </Menu>");
var results = doc.Descendants("Category")
                 .Where(cat => (string)cat.Attribute("name") == "Bebidas")
                 .SelectMany(cat => cat.Elements("Food"))
                 .Where(food => (string)food.Attribute("cocina") == "si")
                 .Select(food => string.Format("{0} {1}", food.Element("Name"), food.Element("Price"))).ToList();

より明確にするために、そのクエリが何をするかを説明しようと思います。

  1. ドキュメントルート要素の子孫である「Category」という名前のすべての要素を取得します
  2. 「name」属性の値が「Bebidas」であるカテゴリのみを選択します
  3. そのカテゴリ内の「食品」要素を1つのコレクションに投影します
  4. 「cocina」属性値が「si」に等しい「food」要素を選択します
  5. 結果要素を「name--price」形式の文字列に投影します
于 2012-05-30T20:25:37.323 に答える
2

LINQ to XMLは問題ありませんが、すぐに混乱する可能性があります。XMLを使用する場合は、XPathを使用して必要なノードをフィルター処理する方法を知っておく必要があります。

これを試して:

foreach (XmlNode node in doc.SelectNodes("//Food[@cocina = 'si']"))
{
    Console.WriteLine(node.SelectSingleNode("Name").InnerText
        + " " 
        + node.SelectSingleNode("Price").InnerText);
}

XPathはどこでもサポートされています。LINQ to XMLは、.NET以外では役に立ちません。

于 2012-05-30T20:49:06.667 に答える
1

これらのノードを取得するコードを記述する代わりに、XPATHを使用する必要があります。

必要なXPath式は"//Food [@cocina='si']"です。

IEはXPathを使用する方法としてdoc.selectNodes(xpath)を使用し、優れたブラウザーはdoc.evaluate()を使用します。

ここを見てください:http ://www.w3schools.com/xpath/xpath_examples.asp

于 2012-05-30T20:25:18.213 に答える