0

私は次のXML構造を持っています:

<html xmlns ="http://www.w3.org/1999/xhtml" >
 <head>
  . .
 </head>
 <body>
  <div id="1"></div>
  <div id="2"></div>
 </body>
</html>

linq to xmlを使用して、id="2"のdivにアクセスしました。XDocumentにドキュメントをロードしました:

   XDocument  ndoc = XDcoument.load(path);
   XElement n = new XElement("name","value");
   XNamespace xn = "http://www.w3.org/1999/xhtml";

ndoc.Descendants(xn + "div").Single(p => p.Attribute("id").Value == "1").Add(n);

                             OR

ndoc.Descendants("div").Single(p => p.Attribute("id").Value == "1").Add(n);

両方のケースを試してみましたが、いずれの場合も、要素を含まない例外シーケンスがありました。ここで問題は何ですか?

4

4 に答える 4

0

これはうまくいくでしょう

XDocument ndoc =XDcoument.load(path);
XElement n = new XElement("name", "value");
XNamespace xn = "http://www.w3.org/1999/xhtml";

var item = ndoc.Descendants(xn + "div").FirstOrDefault(p => p.Attribute("id").Value == "1");
if(item!=null)
    item.Add(n);

Single式から出てくる要素が1つだけであることが確実な場合は、メソッドを使用します。万が一、複数の要素が来る可能性がある場合は、FirstOrDefault()を使用してください

Descendants()これにより、任意のサブレベル(子供、孫など)の条件が一致するすべての要素が得られることに注意してください。

Elements()メソッドは、即時(直接)子のみを提供します。

したがって、慎重に使用してください。

于 2012-07-31T15:32:19.253 に答える
0

私にとって、あなたの例(少し変更された)はうまく機能します:

 var xml = @"<html xmlns ='http://www.w3.org/1999/xhtml' >
 <head>
 </head>
 <body>
  <div id='1'></div>
  <div id='2'></div>
 </body>
</html>";
            XDocument xd = XDocument.Parse(xml);

            XElement n = new XElement("name", "value");
            XNamespace xn = "http://www.w3.org/1999/xhtml";

            xd.Descendants(xn + "div").Single(p => p.Attribute("id").Value == "1").Add(n);

            Console.WriteLine(xd);

出力

<html xmlns="http://www.w3.org/1999/xhtml">
  <head></head>
  <body>
    <div id="1">
      <name xmlns="">value</name>
    </div>
    <div id="2"></div>
  </body>
</html>

だから私はあなたの問題を本当に理解していません。すべて正しくコピーしたかどうかを確認してください=)

于 2012-07-31T15:51:47.863 に答える
0

これはうまくいくはずです

XNamespace xn = XNamespace.Get("http://www.w3.org/1999/xhtml");
ndoc.Descendants(xn + "div").Single(p => p.Attribute("id").Value == "1").Add(n);
于 2012-07-31T15:27:56.597 に答える
0

このXmlライブラリに渦を巻くことができ、次の方法で簡単に取得できます。

XElement root = XElement.Load(path);
XElement div = root.XPathElement("//div[@id={0}]", 1);
if(null != div) // which it shouldn't be
    div.Add(n);
于 2012-07-31T17:45:28.220 に答える