1

次のような相対参照を使用しているように見えるXMLドキュメントからデータを取得しようとしています。

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

2つの質問:

  1. これは正常ですか、それとも一般的ですか?
  2. linq to XML / XDocumentでこれを処理する方法はありますか、それともドキュメントツリーを手動でトラバースする必要がありますか?

編集:

明確にするために、参照は同じXMLドキュメント内の他のノードへの参照です。上記のcontextノードはコンテキストのリストを参照しており、インデックス2のコンテキストを取得するように指示しています。

topicノードは、特定の他のアクションのトピックを参照しているため、さらに心配しています。これにより、トピックのリストが参照される可能性があります。もしそれが起こらなかったら、私はコンテキストとトピックのリストをキャッシュにロードし、それらをそのように調べていただろう。

4

2 に答える 2

0

XPATHクエリを使用してノードを抽出でき、非常に効率的です。

ステップ1:XMLをXMLDocumentにロードしますステップ2:ステップ3を
使用 node.SelectNodes("//*[reference]")
します:その後、XMLノードをループできます。

于 2012-08-26T17:56:46.027 に答える
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;
    }

そして、あなたはそれをこのように使うでしょう(itemXElement):

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