2010-02-15 4 views
1

Может кто-нибудь объяснить, почему это XMLLinq для запроса XML создание пустых элементов из XML

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

при использовании Query

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

storage = c.ToList 

в результате чего в списке (из MyStorage) с двумя пунктами - один со всеми empty (ничего), второй со значениями, указанными в xml выше?

Я решен вопрос, добавив

Where [email protected] IsNot Nothing _ 

перед тем Seletct Новый 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

+0

Я пробовал это (по общему признанию, на C#) и получаю только один элемент в 'storage', с или без предложения' Where' на месте. Не могли бы вы показать нам короткую, но полную программу (a la http://www.yoda.arachsys.com/csharp/complete.html), которая демонстрирует проблему? – AakashM

+0

Я расширил вопрос с примера C# и снимка экрана – Vnuk

ответ

0

Получил его из обновленного образца кода. Когда вы говорите

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

и затем

st.Descendants() 

ваш stявляется документом, не корневой элемент. Поэтому, когда вы запрашиваете у него Descendants, вы перечислите более XElement s - узел items и один узел item, который имеет этот пример. Это узел items, который дает вам «пустой» элемент.

Есть множество способов, чтобы ограничить себя только в item узлов, в зависимости от того, насколько вы уверены может быть о структуре вашего XML - например,

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

Перечислим более только в item узлы найденные как непосредственные дети корневого элемента документа.

+0

Спасибо. Должен признать, что исключение было бы хорошо, потому что я был полностью потерян в этом. – Vnuk