web-dev-qa-db-ja.com

XPathおよびXPathSelectElement

次のxmlがあります

<root>
   <databases>
      <db1 name="Name1" />
      <db2 name="Name2" server="myserver" />
      <db3 name="Name3" />
   </databases>
<root>

XPathクエリのすべての可能な組み合わせでdb2の名前(= "Name2")を読み取るためにすべてを試しましたが、期待した結果が得られませんでした。

これまでの私のコード:

var query = "root/databases/db2.. "; // here I've tried everything 
var doc = XDocument.Load("myconfig.xml");
var dbName =  doc.XPathSelectElement(query);

「Name2」(属性の値)を取得するための正しいクエリは何ですか?

ご協力いただきありがとうございます。

16
gsharp
var dbName = doc.XPathSelectElement("root/databases/db2").Attribute("name");
20
Alex Aza

XPathSelectElement method は、属性ではなく要素の選択にのみ使用できます。

属性については、より一般的な XPathEvaluateメソッド を使用する必要があります。

var result = ((IEnumerable<object>)doc.XPathEvaluate("root/databases/db2/@name"))
                                      .OfType<XAttribute>()
                                      .Single()
                                      .Value;

// result == "Name2"
35
dtb

値(Name2)のname属性、db2要素、これを試してください:

    var query = "root/databases/db2";
    var doc = XDocument.Load("myconfig.xml");
    var dbElement = doc.XPathSelectElement(query);
    Console.WriteLine(dbElement.Attribute("name").Value);

要素の名前がわからない場合(db2)、しかしそれがserver属性を持っていることを知っているなら、これを試してください:

    var query = "root/databases/*[@server]";
    var doc = XDocument.Load("myconfig.xml");
    var dbElement = doc.XPathSelectElement(query);
    Console.WriteLine(dbElement.Attribute("name").Value);

前の例と同じことをしたいが、server属性を持つ複数の要素があり、それらの間で選択したい場合は、次を試してください:

    var query = "root/databases/*[@server='myserver']";
    var doc = XDocument.Load("myconfig.xml");
    var dbElement = doc.XPathSelectElement(query);
    Console.WriteLine(dbElement.Attribute("name").Value);
13