2013-12-10 2 views
0

Вот мой XML:Как использовать XMLReader для анализа XML-документа?

http://simon.ist.rit.edu:8080/Services/resources/ESD/OrgTypes/

Я хочу, чтобы иметь возможность захватить эти клавиатуры под «Type» и игнорировать цифры.

Такие, как врач, скорая помощь и т.д.

<data> 
<row> 
<typeId>0</typeId> 
<type>Physician</type> 
</row> 
<row> 
<typeId>1</typeId> 
<type>Ambulance</type> 
</row> 
<row> 
<typeId>2</typeId> 
<type>Fire Department</type> 
</row> 
<row> 
<typeId>3</typeId> 
<type>Helicopter/Air Transport</type> 
</row> 
</data> 

Как бы сделать это в C#?

+0

Вы еще что-нибудь пробовали? – czuroski

+0

Покажите, что вы уже пробовали, есть много про разбор XML в C#. –

+3

Я бы обманул, создаю объект System.Data.DataTable в памяти, использую функцию DataTable.ReadXML и использую его в удобной DataTable для работы. Но это взломать, и меня, наверное, застрелили бы, если бы я поставил это как реальный ответ. – David

ответ

4
var types = XDocument.Load("http://simon.ist.rit.edu:8080/Services/resources/ESD/OrgTypes/") 
       .Descendants("type") 
       .Select(t => (string)t) 
       .ToList(); 
+0

Значения всегда 'string' поступают из документа Xml. – IAbstract

+0

@ Извлечение и что? Я не понимаю ваш комментарий. Выше кода возвращает 14 элементов как «Список ' –

+0

Я говорю, что строка '(string)' должна быть ненужной. :) ...но я также рекомендую быть явным (поскольку наш OP является новым для C#) и включает 't.Value'. – IAbstract

1

Этот метод действительно неполной и заслуживает некоторого объяснения для новичка C# и LINQ к XML:

var types = XDocument.Load("http://simon.ist.rit.edu:8080/Services/resources/ESD/OrgTypes/") 
       .Descendants("type") 
       .Select(t => (string)t) // under the hood magic 
       .ToList(); 

Использование (string) бросить это немного волшебный и не получает те же результаты, если использовались ToString(). Я объясню ... Я изменил XML только немного:

<type attrib="bar" attrib2="boo" >Resource 
    <foo a="1" a.2="A"/> 
</type> 
// note, I also removed the value of type immediately following Resource node 

(string) бросок на t действует на t.Value под капотом. Без броска, результат:

<type>Physician</type> 
<type>Ambulance</type> 
<type>Fire Department</type> 
<type>Helicopter/Air Transport</type> 
<type>Home Care Agency</type> 
<type>Hospital</type> 
<type>Law Enforcement Agency</type> 
<type>Nursing Home</type> 
<type attrib="bar" attrib2="boo">Resource 
       <foo a="1" a.2="A" /></type> 
<type></type> 
<type>Other</type> 
<type>Hospice</type> 
<type>School</type> 
<type>Emergency Shelter</type> 

Использование (string)t:

Physician 
Ambulance 
Fire Department 
Helicopter/Air Transport 
Home Care Agency 
Hospital 
Law Enforcement Agency 
Nursing Home 
Resource 


Other 
Hospice 
School 
Emergency Shelter 

И t.Value:

Physician 
Ambulance 
Fire Department 
Helicopter/Air Transport 
Home Care Agency 
Hospital 
Law Enforcement Agency 
Nursing Home 
Resource 


Other 
Hospice 
School 
Emergency Shelter 

И, наконец, чтобы показать, что t.ToString() отличается (string)t:

<type>Physician</type> 
<type>Ambulance</type> 
<type>Fire Department</type> 
<type>Helicopter/Air Transport</type> 
<type>Home Care Agency</type> 
<type>Hospital</type> 
<type>Law Enforcement Agency</type> 
<type>Nursing Home</type> 
<type attrib="bar" attrib2="boo">Resource 
       <foo a="1" a.2="A" /></type> 
<type></type> 
<type>Other</type> 
<type>Hospice</type> 
<type>School</type> 
<type>Emergency Shelter</type> 

Все это повторяет некоторые малоизвестные проблемы с LINQ-to-XML.

Моя рекомендация для ясности и простоты технического обслуживания будет выглядеть следующим образом:

var types = XDocument.Load("http://simon.ist.rit.edu:8080/Services/resources/ESD/OrgTypes/") 
       .Descendants("type") 
       .Select(t => t.Value) // be explicit about what you want 
       .ToList(); 

Вы можете найти любой element или descendant из IEnumerable вкуса.

+0

Приятно, если вопрос был * что делает '.Select (t => (string) t)' * mean – EZI

+1

Да ... ** и ** он отвечает на вопрос OP, объясняя, почему другой ответ неявный и плохая форма кодирования. Мы должны предлагать полные ответы и новому пользователю C#, я ожидаю более высокий уровень участия. – IAbstract

+0

'он отвечает на вопрос ОП, объясняя ....' Но копируя всю логику из другого ответа ... Поэтому объяснение чужого ответа не дает ответа. – EZI

Смежные вопросы