Linq To Xml问题使用XElement的方法Elements(XName)

时间:2010-05-02 18:21:20

标签: c# linq-to-xml elements xelement

使用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);

好的,不要小心所有:关注这一点:

当我获得根节点时,它没问题,我得到了正确的结果。

当我使用select指令时,我尝试让每个节点都说:来自

中的e
XRoot.Elements("contact")

好的就是问题所在:如果我使用:来自X在XRoot.Elements()中的e,我得到所有联系节点,但是如果我使用:来自X在XRoot.Elements中的e(“联系人”)我得到的东西:空的SET。 / p>

好的,你告诉我:使用另一个:好的,我这样做,让我们用: from e in XRoot.Elements(),无论如何,我得到了所有节点,这是正确的,但这是另一个问题: 当说:select new Contact((string)e.Element("name"), (string)e.Element("email"), "1-1-1", null, null);我试图访问<name>, <email> ...我必须使用。元素(“名称”)并且它不起作用!!!!!!!!这是什么地狱?????????????它看起来我不符合名称我通过但它怎么可能。我知道Elements()函数需要重载一个参数,它是一个映射到字符串的XName。请考虑我写的代码来自一个例子,它应该可以工作。

2 个答案:

答案 0 :(得分: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);

那应该有所帮助。有关详细信息,请参阅Working with XML Namespaces上的MSDN文档。

答案 1 :(得分:0)

对我来说,我解决了这个问题,因为我的XML中没有命名空间:

xmldoc.Root.Elements("contact");

我忘了使用“Root”方法。