1

我正在尝试编写一个 XPath 表达式,以从其在“质量”中的值中选择节点的名称,然后在“质量名称”中选择名称先前已捕获的节点内的值。

例如在“质量”中 - 得到值“4”,取名为“rarity3”,然后在“qualityNames”中我得到名为“rarity3”的节点并取值为“amazingrarity”

<result>
  <status>1</status>
  <qualities>
    <Normal>0</Normal>
    <rarity1>1</rarity1>
    <rarity2>2</rarity2>
    <vintage>3</vintage>
    <rarity3>4</rarity3>
    <rarity4>5</rarity4>
  </qualities>
  <qualityNames>
    <Normal>Normal</Normal>
    <rarity1>Genuine</rarity1>
    <rarity2>rarity2</rarity2>
    <vintage>Vintage</vintage>
    <rarity3>amazingrarity</rarity3>
    <rarity4>Unusual</rarity4>
  </qualityNames>
</result>

我在 C#(它是一个 MVC 应用程序)中执行此操作,我更喜欢使用 XPath,因为我正在索引 XML,并且我还没有找到查询内存技术的最快方法(这个 XML 文件有 ~3MB我正在使用 IndexingXPathNavigator)。

4

3 回答 3

4

使用 local-name() 和 text() 函数 + 谓词。对于值“4”,它将是

//qualityNames/*[local-name()=local-name(//qualities/*[text() = '4'])]

http://www.xpathtester.com测试

于 2013-05-27T20:57:22.940 回答
1

听起来您想创建一个键/值对字典(假设节点名称只需要查找匹配项并且对您的代码并不重要)。

如果是这样,您可以使用以下内容:

var doc = XElement.Parse(@"<result>
<status>1</status>
<qualities>
    <Normal>0</Normal>
    <rarity1>1</rarity1>
    <rarity2>2</rarity2>
    <vintage>3</vintage>
    <rarity3>4</rarity3>
    <rarity4>5</rarity4>
</qualities>
<qualityNames>
    <Normal>Normal</Normal>
    <rarity1>Genuine</rarity1>
    <rarity2>rarity2</rarity2>
    <vintage>Vintage</vintage>
    <rarity3>amazingrarity</rarity3>
    <rarity4>Unusual</rarity4>
</qualityNames>
</result>");

var query = from quality in doc.XPathSelectElements("qualities/*")
            join qualityName in doc.XPathSelectElements("qualityNames/*")
            on quality.Name equals qualityName.Name
            select new { Key = quality.Value, Value = qualityName.Value };
var qualities = query.ToDictionary(a => a.Key, a => a.Value);
var quality3 = qualities["3"];
// quality3 == "Vintage"
var quality4 = qualities["4"];
// quality4 == "amazingrarity"

编辑:如何缓存此字典的示例

// add reference to System.Web dll
public Dictionary<string, string> GetQualities()
{
    // assuming this code is in a controller
    var qualities = this.HttpContext.Cache["qualities"] as Dictionary<string, string>;
    if (qualities == null)
    {
        // LoadQualitiesFromXml() is the code above
        qualities = LoadQualitiesFromXml();
        this.HttpContext.Cache["qualities"] = qualities;
    }
    return qualities;
}
于 2013-05-28T01:16:57.470 回答
0

我想这就是你问的

        var rarity3ValueInQualities = xml.SelectSingleNode("/result/qualities/rarity3").InnerText;
        var rarity3ValueInqualityNames = xml.SelectSingleNode("/result/qualityNames/rarity3").InnerText;
于 2013-05-27T21:05:34.207 回答