Linq to XML查询从XML创建空项

时间:2010-02-15 10:36:57

标签: c# vb.net linq-to-xml

有人可以解释为什么这个xml

<?xml version="1.0" encoding="utf-8"?>
<items>
  <item id="77" cityID="EE12345" cityDatum="15.2.2010. 11:28:35" />
</items>

使用查询时

Dim c = From items In st.Descendants _
             Where items.@id IsNot Nothing _
        Select New myStorage With {.id = items.@id, .cityID = items.@cityID, .cityDatum = items.@cityDatum}

storage = c.ToList

导致列表(myStorage)有两个项目 - 一个具有所有空(无)属性,第二个具有在上面的xml中看到的值?

我已经通过添加

解决了这个问题
Where items.@id IsNot Nothing _
在Seletct New myStorage之前的

,但我有一种感觉,我不应该这样做。

我在C#中重新创建了这个,storage.xml与上面指定的完全相同。

    private void Form1_Load(object sender, EventArgs e)
    {

    XDocument st;
    st = XDocument.Load("C:\\storage.xml");
   Object c = from items in st.Descendants()
                    select new {id = items.Attribute("id"), cityID = items.Attribute("cityID"), cityDatum = items.Attribute("cityDatum")};
    }

如果您有些人无法复制这些结果,请点击此处截图:

screenshot http://www.incito.hr/15.2.2010.png

1 个答案:

答案 0 :(得分:0)

从您更新的代码示例中获取。当你说

st = XDocument.Load("C:\\storage.xml");

然后

st.Descendants()

您的st文档,而不是根元素。因此,当您向其Descendants询问时,您枚举 2 XElement s - items节点和此示例中的一个item节点有。 items节点为您提供“空”项目。

有很多方法可以将自己限制在item个节点,具体取决于您对xml结构的确定程度 - 例如,

From item In st.Root.Elements("item") 

将枚举 item个节点,这些节点被视为文档根元素的直接子节点。