2

これが私のXMLファイルです:

<hashtable>
  <entry>
    <string>krishna.com</string>
    <hashtable>
      <entry>
        <string>status</string>
        <string>available</string>
      </entry>
      <entry>
        <string>classkey</string>
        <string>domcno</string>
      </entry>
    </hashtable>
  </entry>
  <entry>
    <string>krishna.net</string>
    <hashtable>
      <entry>
        <string>status</string>
        <string>regthroughothers</string>
      </entry>
      <entry>
        <string>classkey</string>
        <string>dotnet</string>
      </entry>
    </hashtable>
  </entry>
</hashtable>

krishna.com(ノード:hashtable / entry / string)でステータスが利用可能(ノード:hashtable / entry / hashtable / entry / string)であることを確認したい。

stringここで私の難しさは、 &のようなノードの類似した名前が非常に多いことです。したがって、 (文字列ノード)と(文字列ノード)をチェックして、ドメインkrishna.comとkrishna.netが利用可能entryかどうかを確認するにはどうすればよいですか。statusstatusavailable

4

5 に答える 5

3

あなたはこのようなことを試すことができます

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("Path to your .xml file");
XmlNodeList nodeList = xmlDoc.SelectNodes("//entry/string");

独自のコードを記述して、nodeList の情報を取得できるようになりました。

于 2012-12-30T22:14:37.373 に答える
1

これがあなたのためのXPathソリューションです。

using System;
using System.Xml.Linq;
using System.Xml.XPath;

static string GetStatus(XDocument doc, string nodeName)
{
    //The first xpath translates to: "Select the <hashtable> element that immediately
    // follows the <string> element with a value of nodeName."
    //The second xpath selects the <string> element that immediately follows another <string>
    // element with a value of 'status'. This selected element is a descendant of the
    // <hashtable> element that was selected first. 
    XElement status = doc.XPathSelectElement("//hashtable[preceding-sibling::string = '" + nodeName + "']")
                         .XPathSelectElement("descendant::string[preceding-sibling::string = 'status']");
    return status.Value;
}

これを使用することはかなり自明です:

XDocument doc = XDocument.Load("File_path_to_XML.xml");
string status = GetStatus(doc, "krishna.com");
// status == "available"
string status2 = GetStatus(doc, "krishna.net");
// status2 == "regthroughothers"
于 2012-12-30T22:57:15.653 に答える
0

これが私が思うことです:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("your_xml_file.xml");
XmlElement root = xmlDoc.DocumentElement;
string query = "child::entry/child::string[following-sibling::*/descendant::string[text()='available']]";
XmlNodeList nodes = root.SelectNodes(query);
foreach (XmlNode node in nodes)
{
    Console.WriteLine(node.InnerText);
}  
//Result
krishna.com

「利用可能」なドメイン名が表示されます。
クエリ文字列で、「child::entry」は「entry」と呼ばれるrootの子を選択します。(子孫ではありません)。したがって、パスは「/ hashtable/entry」です。
次に、「エントリ」ノードごとに、ドメイン名を含む「文字列」の子を選択します。このステップでは、式を使用して「使用可能な」ものを選択します。これで、パスは「/ hashtable / entry/string」になります。式では、最初に次のすべての兄弟が選択され、xmlでは「ハッシュテーブル」のみが条件を満たします。最後に、次のすべての兄弟に対して、子孫の名前が「文字列」であり、その内部テキストが「使用可能」であるかどうか、その子孫をチェックします。次に、現在のドメインノードが選択されます。
お役に立てば幸いです。

于 2012-12-31T01:00:36.827 に答える
0

次のようなものが必要になる場合があります。

//hashtable/entry/string[1][text() = 'krishna.com']"/../hastable/entry/string[1][text() = 'status']"/../string[2][text() = 'available']

テストされていませんが、注意すべき点がいくつかあります。

  • //任意のノードから開始することを意味します
  • A/B要素Aの下の要素Bを意味します
  • A/B[1]要素Aの下の最初の要素Bを意味します
  • A[text() = 'foo']fooをテキスト値として含む要素Aを意味します
  • ..親ノードを意味します

これが機能しない場合は、いつでも最初にhashtablefor krishna.comを見つけてから、stringノードの下の1番目の位置に値「status」を含むノードを見つけて、そのノードentryの兄弟のみが「利用可能"。stringstring

于 2012-12-30T22:38:33.967 に答える
0

LINQ to XML を使用して、指定された基準を満たすノードを検索できます。これは、例の構造のように、子「ハッシュテーブル」ノードの下に「ステータス」および「使用可能」子ノードを含む最初のレベルの「エントリ」ノードを選択する例です。

XDocument doc;
using (FileStream fs = new FileStream("XMLFile1.xml", FileMode.Open))
{
   doc = XDocument.Load(fs);
}
string[] elms = doc.Element("hashtable").Elements("entry").Where(elm => 
            elm.Element("hashtable").Element("entry").Elements("string").First().Value == "status" &&
            elm.Element("hashtable").Element("entry").Elements("string").Skip(1).First().Value == "available")
        .Select(elm => elm.Element("string").Value).ToArray();

ファイル構造が提供した例と異なる可能性がある場合は、それに応じてクエリを変更する必要があります

于 2012-12-30T22:15:55.323 に答える