4

Linq To Xml の使用に問題があります。

シンプルなコード。私はこのXMLを持っています:

<?xml version="1.0" encoding="utf-8" ?>
<data xmlns="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/directory file.xsd">
<contact>
 <name>aaa</name>
 <email>email@email.ext</email>
 <birthdate>2002-09-22</birthdate>
 <telephone>000:000000</telephone>
 <description>Description for this contact</description>
</contact>
<contact>
 <name>sss</name>
 <email>email@email.ext</email>
 <birthdate>2002-09-22</birthdate>
 <telephone>000:000000</telephone>
 <description>Description for this contact</description>
</contact>
<contact>
 <name>bbb</name>
 <email>email@email.ext</email>
 <birthdate>2002-09-22</birthdate>
 <telephone>000:000000</telephone>
 <description>Description for this contact</description>
</contact>
<contact>
 <name>ccc</name>
 <email>email@email.ext</email>
 <birthdate>2002-09-22</birthdate>
 <telephone>000:000000</telephone>
 <description>Description for this contact</description>
</contact>

オブジェクト Contact にマッピングされているすべての連絡先を取得したいと考えています。これを行うには、次のコード フラグメントを使用します。

XDocument XDoc = XDocument.Load(System.Web.HttpRuntime.AppDomainAppPath + this.filesource);
XElement XRoot = XDoc.Root;
//XElement XEl = XElement.Load(this.filesource);
var results = from e in XRoot.Elements("contact") 
 select new Contact((string)e.Element("name"), (string)e.Element("email"), "1-1-1", null, null);
List<Contact> cntcts = new List<Contact>();
foreach (Contact cntct in results) {
 cntcts.Add(cntct);
}
Contact[] c = cntcts.ToArray();
// Encapsulating element
Elements<Contact> final = new Elements<Contact>(c);

OK、すべて気にしないでください。これに注目してください。

ルートノードを取得すると、大丈夫です。正しく取得できます。

select ディレクティブを使用すると、すべてのノードが次のように表示されます: from e in

XRoot.Elements("contact")

問題はここにあります: from e in XRoot.Elements() を使用すると、すべての連絡先ノードが取得されますが、from e in XRoot.Elements("contact") を使用すると、何も取得されません: 空のセット。

OK 教えてください: もう 1 つを使用してください: OK I DO SO, let's use: from e in XRoot.Elements(), とにかくすべてのノードを取得します, それは正しいですが、ここで別の問題が発生します: 言うとき: select new Contact((string)e.Element("name"), (string)e.Element("email"), "1-1-1", null, null);I Try to access <name>, <email>... I HAVE TO USE .Element ("名前") そしてそれも機能しません!!!!!!!!これは一体何ですか????????????? パスした名前と一致しないようですが、どうしてそれが可能なのでしょうか。Elements() 関数は、オーバーロードされた、文字列にマップされる XName である 1 つの引数を取ることを知っています。私が書いたコードは例に基づいていると考えてください。うまくいくはずです。

4

2 に答える 2

16

非常に簡単です: 無視している XML 名前空間があります。

<data xmlns="http://www.example.com"  
      **************************

それを Linq-to-XML クエリに追加する必要があります!

何かのようなもの:

XNamespace ns = "http://www.example.com";

その後

XRoot.Elements(ns + "contact") 

もちろん、子要素にアクセスするときも XML 名前空間を使用します。

var results = from e in XRoot.Elements("contact") 
              select new Contact(e.Element(ns + "name").Value, 
                                 e.Element(ns + "email").Value, 
                                 "1-1-1", null, null);

それは役立つはずです。詳細については、 XML 名前空間の操作に関するMSDN ドキュメントを参照してください。

于 2010-05-02T18:25:42.677 に答える
0

XMLに名前空間がなかったので、私はそのように解決しました:

xmldoc.Root.Elements("contact");

「ルート」メソッドを使用するのを忘れていました。

于 2015-11-20T15:39:59.813 に答える