2

次の XML テキストから要素の値を取得しようとしていますが、要素から削除しAddressない限り見つかりません。ただし、XML は有効です。ここで何が問題なのですか?xmlns="http://www.foo.com"Root

Web サービスから XML テキストを取得しているため、それを制御することはできませんが、必要xmlnsに応じて最後の手段としてその部分を取り除くことができます。

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.foo.com">
  <Address>Main St SW</Address>
</Root>
var doc = XDocument.Parse(xmlTextAbove);
var address = doc.Descendants().Where(o => o.Name == "Address").FirstOrDefault();
Console.WriteLine(address.Value); // <-- error, address is null.
4

2 に答える 2

11

xml には名前空間が含まれているため、コードでそれを言及する必要があります。これはうまくいきます:

    XNamespace nsSys = "http://www.foo.com";
    XElement xDoc = XElement.Load("1.xml");
    XElement xEl2 = xDoc.Descendants(nsSys + "Address").FirstOrDefault();

xmlns:xsiただし、xml には繰り返しが含まれており、 xmlns:xsdxml 形式ごとに 1 回だけ発生する必要があるため、xml を少し変更する必要がありました。

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns="http://www.foo.com" >
  <Address>Main St SW</Address>
</Root>

MSDN の関連記事: XNamespace クラス

于 2013-01-18T00:53:47.927 に答える
11

ドキュメント ルートの XML 名前空間は のテキスト表現に含まれていo.Nameます。これは実際には のインスタンスであるXNameため、条件が一致することはありません。

最も簡単な修正はLocalName、比較に使用することです。

.Where(o => o.Name.LocalName == "Address")
于 2013-01-18T00:53:57.003 に答える