【问题标题】:Linq To Xml problems using XElement's method Elements(XName)使用 XElement 的方法 Elements(XName) 的 Linq To Xml 问题
【发布时间】:2010-05-02 18:21:19
【问题描述】:

我在使用 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>

我想让每个联系人将其映射到一个对象联系人上。为此,我使用以下代码片段:

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 指令时,我试图让每个节点都说: from e in

XRoot.Elements("contact")

好的,问题来了:如果我使用:from e in XRoot.Elements() 我会得到所有联系人节点,但如果我使用:from e in XRoot.Elements("contact") 我什么都得不到:Empty SET。

好的,你告诉我:使用另一个:OK I DO SO,让我们使用: from e in XRoot.Elements(),无论如何我都得到了所有节点,这是对的,但另一个问题来了: 当说:select new Contact((string)e.Element("name"), (string)e.Element("email"), "1-1-1", null, null); 我尝试访问&lt;name&gt;, &lt;email&gt;...我必须使用 .Element("name") 并且它也不起作用!!!!!!!!!这是什么鬼??? ??????看来我与我通过的名字不匹配,但这怎么可能。我知道 Elements() 函数采用重载的一个参数,该参数是一个映射到字符串的 XName。请考虑我写的代码来自一个例子,它应该可以工作。

【问题讨论】:

  • 欢迎使用 Stackoverflow - 一句忠告:如果您发布代码 sn-ps 或 XML 片段,突出显示这些行并单击“代码”按钮 (101 010) 在编辑器工具栏中正确格式化它们。让您的帖子更美观、更具可读性!

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


【解决方案1】:

很简单:有一个 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 文档。

【讨论】:

  • 这可能是我对 linq2xml API 的唯一抱怨。我工作过的大多数软件都对命名空间不感兴趣,但无论如何都需要代码来处理它。
  • @Frank:但是当你的 API 公然忽略它们时,拥有命名空间(专门用于消除同名元素的歧义)有什么好处?对我来说没有多大意义,真的....
  • 真的...我现在就试试,无论如何,谢谢谢谢,太棒了,您回复我的速度如此之快....非常感谢,我会让您知道情况如何。 .. 必须尝试:)
  • 命名空间在 XML 中很有用,但我很少需要从不同的命名空间中读取。需要不断地重新指定命名空间似乎有点过头了。
  • 如果你愿意,你可以忽略命名空间:XRoot.Elements().Where(e => e.Name.LocalName == "contact")
【解决方案2】:

对我来说,我是这样解决的,因为我的 XML 中没有命名空间:

xmldoc.Root.Elements("contact");

我忘记使用“Root”方法了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多