3

LINQ-to-XML (XElement オブジェクト) を使用して、要素の内部テキスト値を見つけようとしています。サービスを呼び出すと、XElement オブジェクトに正常に読み込まれたという XML 応答が返されます。要素の 1 つの内部テキストを抽出したいのですが、これを実行しようとするたびに結果が null になります。

非常に単純なものが欠けているように感じますが、LINQ-to-XML にはかなり慣れていません。どんな助けでも大歓迎です。

StatusInfo/Status 要素の内部テキスト値を取得しようとしています。返される XML ドキュメントは次のとおりです。

<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title type="text">My Response</title>
  <id>tag:foo.com,2012:/bar/06468dfc-32f7-4650-b765-608f2b852f22</id>
  <author>
    <name>My Web Services</name>
  </author>
  <link rel="self" type="application/atom+xml" href="http://myServer/service.svc/myPath" />
  <generator uri="http://myServer" version="1">My Web Services</generator>
  <entry>
    <id>tag:foo.com,2012:/my-web-services</id>
    <title type="text" />
    <updated>2012-06-27T14:22:42Z</updated>
    <category term="tag:foo.com,2008/my/schemas#system" scheme="tag:foo.com,2008/my/schemas#type" />
    <content type="application/vnd.my.webservices+xml">
      <StatusInfo xmlns="tag:foo.com,2008:/my/data">
        <Status>Available</Status>  <!-- I want the inner text -->
      </StatusInfo>
    </content>
  </entry>
</feed>

値を抽出するために使用しているコードのスニペットを次に示します (これは機能しません)。

    XElement root = XElement.Load(responseReader);
    XNamespace tag = "tag:foo.com,2008:/my/data";
    var status = (from s in root.Elements(tag + "Status")
                 select s).FirstOrDefault();

私のstatus変数は常にnullです。これについていくつかのバリエーションを試しましたが、役に立ちませんでした。私を混乱させているのは名前空間tagであり2008、定義されています。これを正しく処理しているかどうか、またはこれに対処するためのより良い方法があるかどうかはわかりません。

また、XML スキーマや XML の構造を制御することもできません。私が使用しているサービスは私の手に負えません。

助けてくれてありがとう!

4

2 に答える 2

2

Descendants()代わりに試してくださいElements()

XElement x = XElement.Load(responseReader);
XNamespace ns = "tag:foo.com,2008:/my/data";
var status = x.Descendants(ns + "Status").FirstOrDefault().Value;
于 2012-06-27T16:53:11.770 に答える
0

フィードには2つの名前空間があります。

  1. Atom名前空間
  2. タグの名前空間

外側のxmlはAtom名前空間を使用する必要があり、内側のxmlの一部はタグ名前空間を使用する必要があります。すなわち、

var doc = XDocument.Load(responseReader);
XNamespace nsAtom = "http://www.w3.org/2005/Atom";
XNamespace nsTag = "tag:foo.com,2008:/my/data";

// get all entry nodes / use the atom namespace
var entry = doc.Root.Elements(nsAtom + "entry");

// get all StatusInfo elements / use the atom namespace
var statusInfo = entry.Descendants(nsTag + "StatusInfo");

// get all Status / use the tag namespace
var status = statusInfo.Elements(nsTag + "Status");

// get value of all Status
var values = status.Select(x => x.Value.ToString()).ToList();
于 2012-06-27T17:08:18.930 に答える