1

我正在尝试从似乎使用这样的相对引用的 XML 文档中提取数据:

<action>
  <topic reference="../../action[110]/topic"/>
  <context reference="../../../../../../../../../../../../../contexts/items/context[2]"/>
</action>

两个问题:

  1. 这是正常的还是常见的?
  2. 有没有办法用 linq to XML / XDocument 来处理这个问题,还是我需要手动遍历文档树?

编辑:

澄清一下,这些引用指向同一 XML 文档中的其他节点。上面的context节点引用了一个上下文列表,并说要在索引 2 处获取一个。

topic节点更让我担心,因为它引用了某个其他操作的主题,而该主题又可以引用主题列表。如果没有发生这种情况,我只会将上下文和主题列表加载到缓存中并以这种方式查找它们。

4

2 回答 2

0

我最终手动遍历树。但是使用扩展方法,一切都很好,而且不碍事。以防它将来可能对任何人有所帮助,这就是我为我的用例汇总的内容:

public static XElement GetRelativeNode(this XAttribute attribute)
    {
        return attribute.Parent.GetRelativeNode(attribute.Value);
    }

    public static string GetRelativeNode(this XElement node, string pathReference)
    {
        if (!pathReference.Contains("..")) return node; // Not relative reference

        var parts = pathReference.Split(new string[] { "/"}, StringSplitOptions.RemoveEmptyEntries);
        XElement current = node;
        foreach (var part in parts)
        {
            if (string.IsNullOrEmpty(part)) continue;
            if (part == "..")
            {
                current = current.Parent;
            } 
            else
            {
                if (part.Contains("["))
                {
                    var opening = part.IndexOf("[");
                    var targetNodeName = part.Substring(0, opening);
                    var ending = part.IndexOf("]");
                    var nodeIndex = int.Parse(part.Substring(opening + 1, ending - opening - 1));

                    current = current.Descendants(targetNodeName).Skip(nodeIndex-1).First();
                } 
                else
                {
                    current = current.Element(part);    
                }

            }
        }

        return current;
    }

然后你会像这样使用它(itemis an XElement):

item.Element("topic").Attribute("reference").GetRelativeNode().Value
于 2012-09-18T12:39:33.767 回答
0

您可以使用 XPATH Query 来提取节点,它非常有效。

Step1:将 XML 加载到 XMLDocument 中
Step2:使用 node.SelectNodes("//*[reference]")
Step3:之后您可以循环遍历 XML 节点。

于 2012-08-26T17:56:46.027 回答