XML根元素的值完全错误,没有找到子节点

时间:2011-12-27 20:58:36

标签: c# linq linq-to-xml

我有一个非常基本的XML文件,如下所示:

<allData>
  <allDataDetails>
    <quoteid>ABC123</quoteid>
    <customername>John Smith</customername>
  </allDataDetails>
  <allDataDetails>
    <quoteid>DEF456</quoteid>
    <customername>Jane Doe</customername>
  </allDataDetails>
</allData>

我的XSD指定必须至少存在1个allDataDetails元素。该文件已经过验证。

但是,当使用Linq查询XML时,我似乎无法识别或查询allData中的内部元素。相反,当我在调试器中查看时,Value属性是连接的所有数据。它看起来像这样:

ABC123John SmithDEF456Jane Doe

这是我的查询代码。 myRows总是为null,因为我似乎无法得到后代:

XDocument entityXml = XDocument.Parse(myDataString);

var myRows = from d in entityXml.Descendants("allDataDetails")
             select new
             {
                quoteid = d.Element("quoteid").Value,
                customername = d.Element("customername").Value
             };

任何人都知道这里可能出现什么问题?

2 个答案:

答案 0 :(得分:2)

我的印象是你在本地窗口中看到在错误的变量 - 你正在查看整个XDocument,它的.Value属性确实会像所有节点值的串联字符串.....

但是你真的应该看{/ 1}}变量 - 如果你真的执行你发布的代码,你应该看到:

enter image description herefull picture here

不是'你正在寻找/期待什么???

答案 1 :(得分:1)

我只是运行您的示例代码,修复了一些语法错误:  并且值得客户名称的逗号错误,请尝试下面的版本,它应该可以工作。

string myDataString = @"<allData>
                          <allDataDetails>
                            <quoteid>ABC123</quoteid>
                            <customername>John Smith</customername>

                          </allDataDetails>
                          <allDataDetails>
                            <quoteid>DEF456</quoteid>
                            <customername>Jane Doe</customername>

                          </allDataDetails>
                        </allData>";
             XDocument entityXml = XDocument.Parse(myDataString);


             var myRows = from d in entityXml.Descendants("allDataDetails")
                      select new
                        {
                            quoteid = d.Element("quoteid").Value
                            ,customername = d.Element("customername").Value
                        };
             foreach (var rw in myRows)
                 Console.WriteLine(rw.customername + "\t" + rw.quoteid);