3

私は次のxmlを持っています

 <root>
    <data>
      <person>tewst</person>
      <data>
        <phone>djk</phone>
        <email>dsd</email>
      </data>
    </data>
  </root>

c# SelectSingleNode を使用して、2 番目の「データ」ノードに移動し、電子メール タグの後に新しい要素呼び出し「phone2」を挿入しようとしています。問題は、正しい「データ」ノードに到達できないことです。これは私がそこに到達するために使用しているコードであり、機能しません。どんな助けでも大歓迎です。ありがとうございました

XMLDocument doc = new XMLDocument("xml file here");
var node = doc.SelectSingleNode("//data[last()]");

XMLElement phone1 = doc.CreateElement("phone2");
phone1.InnerText = "12";
node.AppendChild(phone1);

問題は、ノードが null であることです。

解決:

XMLDocument doc = new XMLDocument("xml file here");
var node = doc.SelectSingleNode("(//data)[last()]");
4

2 に答える 2

4

//data[last()]data親の最後の子であるノードを選択dataするため、例では2つのノードを選択します:

1)ノードの最後のdataroot

<data>
    <person>tewst</person>
    <data>
        <phone>djk</phone>
        <email>dsd</email>
    </data>
</data>

2) 最初のノードの最後のdatadata

<data>
    <phone>djk</phone>
    <email>dsd</email>
</data>

dataドキュメント全体の最後のものを選択するには、次を使用します。

(//data)[last()]
  • //datadataネストされているかどうかにかかわらず、すべての子孫要素のノードセットを生成します。
  • [last()]ノードセットの最後のノードを選択します
  • を括弧()で囲むと、 thenではなく then//dataとして解釈されます。//data[last()]//data[last()]
于 2013-08-31T11:20:03.080 に答える
1

これを行うには、いくつかの方法があります。

(1) XML の構造が常に上記のようになることがわかっている場合は、「ルート」要素、「データ」の子が 1 つ、「データ」の親の下に「データ」の子が 1 つだけある場合、2 番目の要素にアクセスできます。 XPath 式を直接使用する「data」要素:

XmlNode node = doc.SelectSingleNode("/root/data/data");

(2)「ルート」要素の下に複数の「データ」要素がある場合は、次のことができます。

XmlNodeList nodeList = doc.SelectNodes("//data/data");

この XPath 式は、ドキュメント内のすべての最上位の「データ」要素の下にある最初の「データ」要素を返します。たとえば、次のような XML ドキュメントがあるとします。

<root>
    <data>
      <person>tewst</person>
      <data>
        <phone>djk</phone>
        <email>dsd</email>
      </data>
    </data>
    <data>
      <person>two</person>
       <data>
        <phone>bbb</phone>
        <email>ddd</email>
       </data>
    </data>
</root>

...このコードの出力は切り取られました:

XmlNodeList nodeList = doc.SelectNodes("//data/data");

foreach (XmlNode parentData in nodeList)
    Console.WriteLine(parentData.InnerXml.ToString());

...生成されます:

<phone>djk</phone><email>dsd</email>
<phone>bbb</phone><email>ddd</email>

お役に立てれば。

于 2013-08-31T01:08:59.710 に答える