0

作成したさまざまなXMLドキュメントをウォークするC#コードがあります。多くの場合、既知の子要素を取得する必要があります(それが唯一の子である場合もあれば、他の兄弟が存在する場合もあります)。親を指定すると、子の名前が子の要素を返す関数があります。

public static XmlElement GetChildElement(XmlElement parentElement, string childName) 
{
    return parentElement.GetElementsByTagName(childName).Cast<XmlElement>().FirstOrDefault();
}

これは問題なく動作しますが、先日、XPathまたはLINQtoXMLを使用してよりクリーンで簡単に実行できるかどうか疑問に思いました。私が見つけたXPathの例のほとんどは、ドキュメントの構造全体を知りたいようで、親と子だけを知っているジェネリック関数が必要です。Linq to XMLの方が有望なようですが、探しているものに一致する例は見つかりませんでした。

4

3 に答える 3

6

LINQ to XMLを使用すると、これが非常に簡単になります。次のXContainer.Element方法を使用するだけです。

XElement child = parent.Element(elementName);

これにより、最初の要素が存在する場合はそれが得られ、存在しない場合はnullが得られます。

于 2013-03-11T20:03:51.743 に答える
1

XmlNode.SelectSingleNodeは、XElementを使用できない場合に探しているメソッドです。

 var result = parentElement.SelectSingleNode(
      string.Format("*[local-name()='{0}']", nameWithoutPrefix));

私のサンプルは名前空間を使ってチートしていることに注意してください(すべてを受け入れます)。あなたのケースで名前空間を正しくサポートする必要があるかどうかを理解する必要があります。

于 2013-03-11T20:14:27.650 に答える
1

あなたがすでに持っているものを考えると、あなたはこれをすることができます:

public static XmlElement GetChildElement(XmlElement parentElement, string childName) 
{
    return parentElement[childName];
}

これにより、最初に一致する子要素が返されます。存在しない場合はnullが返されます。ちなみに、これに便利なメソッドを使用する意味があるかどうかはわかりませんが、このメソッドへの参照がすでにある場合は、上記の変更が機能します。

ここで注意すべきことの1つは、指定したコードが最初に一致する子要素を返さないことです。最初に一致する子孫要素を返します。それが実際にあなたが望むものである場合、あなたはこれを行うことができます:

public static XmlElement GetChildElement(XmlElement parentElement, string childName) 
{
    return parentElement.SelectSingleNode("//" + childName) as XmlElement;
}
于 2013-03-11T20:14:45.327 に答える