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(节点:哈希表/条目/字符串)查找状态可用(节点:哈希表/条目/哈希表/条目/字符串)。

在这里我的困难是有很多类似的节点名称,例如string& entry,所以我如何通过检查(string node) 和(string node)status来检查域 krishna.com 和 krishna.net 是否可用。statusavailable

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

您可以使用 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 回答
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节点下的第一个位置找到包含值“status”的entry节点,然后确保该节点的唯一兄弟string节点是另一个string包含“可用的”。

于 2012-12-30T22:38:33.967 回答
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”。(不是后代)。所以路径是“/hashtable/entry”。
接下来,对于每个“入口”节点,它将选择包含域名的“字符串”子节点。在这一步中,它使用一个表达式来仅选择“可用”的那些。现在路径变为“/hashtable/entry/string”。在表达式中,首先它将选择所有以下兄弟姐妹,并且在您的 xml 中,只有“哈希表”满足条件。最后,对下面所有的兄弟姐妹,我们检查它的后代,如果后代的名字是“string”并且它的内部文本是“available”,然后将选择当前域节点。
希望它有帮助。

于 2012-12-31T01:00:36.827 回答