2015-03-18 3 views
-1

Я хотел бы получить узлы в списке, у которого есть свойство isRequired = true. из следующего xml, я должен получить accountno и city в списке узлов. Я использую XmlDocument. Может кто-нибудь предложить, как это сделать?Получить список узлов XML, используя значение свойства

<sqltables> 

    <account> 
     <accountno Type="int" Exec="GetGlobalValue" isRequired="true"/> 
     <accountname Type="string" Exec="GetGlobalValue" /> 
    </account> 

    <address> 
     <city Type="string" Exec="GetGlobalValue" isRequired="true"/> 
     <stateType="string" Exec="GetGlobalValue" /> 
     <zipcode Type="string" Exec="GetGlobalValue" /> 
    </address> 

+0

Пожалуйста, после того, что вы уже пробовали уже у вас есть требование использовать '' XmlDocument' XDocument', что позволяет Linq к XML намного проще в использовании.?. – JNYRanger

+0

Я не использую Linq для XML. Я использую XMLdocument, который будет загружать данные xml, как показано ниже. XmlDocument ExampleDataX ml = новый XmlDocument(); ExampleDataXml.LoadXml (XmlData); Мне нужно узнать узлы XML, у которых есть isRequired true в этом xmldocument. –

+0

Я знаю об этом. Однако вы не разместили какой-либо код или не объяснили, почему * вы используете 'XmlDocument' вместо' XDocument' для этого простого использования. Если вы собираетесь добавить код, отредактируйте свой вопрос и покажите нам, что вы уже сделали. – JNYRanger

ответ

0

Это гораздо проще в использовании Linq к XML, но с помощью XmlDocument вы можете найти узлы, используя XPath запросов.

XmlDocument doc = new XmlDocument(); 
doc.Load(xmlData); 
XmlNode root = doc.DocumentElement; 
XmlNodeList nodes = root.SelectNodes("//account/accountno[@isRequired='true']"); 

Вы можете перебирать на nodes для доступа к данным. Вы просто напишете выражение simlar XPath для запроса типа учетной записи. Лично я не эксперт XPath, поэтому возьмите вышеуказанное выражение с солью. Вот в MSDN по размещению элементов с помощью XPath: https://msdn.microsoft.com/en-us/library/d271ytdx(v=vs.110).aspx

Это гораздо проще в XDocument (он же Linq к XML)

XDocument doc = XDocument.Load(xmlData); 
var nodes = doc.Descendants("accountno").Where(n => n.Attribute("isRequired").Value.equals("true")); 

ПРИМЕЧАНИЕ: выше лямбда может привести кNullReferenceExceptionесли вы Арен «т осторожны

Вы можете перебирать на nodes в этом, а также, однако на этот раз он возвращает объект IEnumerable<XElement> вместо XmlNodeList. Вот хорошая отправная точка для Linq к XML: https://msdn.microsoft.com/en-us/library/bb387098.aspx

EDIT:

За комментариями ниже Ниже приведен пример запроса LINQ, который возвращает все, где «isRequired.equals (» истинные)»истинно независимо от имени элемента тега:

doc.Descendants().Where(n => n.Attribute("isRequired") != null && n.Attribute("isRequired").Value.Equals("true")); 
+0

Спасибо за предложение. Я не хочу указывать разлагающийся узел. Он должен пересечь весь xml и найти для меня узлы с isRequired значением true. Я попробовал следующееXDocument xDoc = XDocument.Load (xmlData); var nodelist = xDoc.Descendants(). Где (n => n.Attribute ("isRequired"). Value.Equals ("true")); но это дает мне ссылку на объект, не установленную на ошибку объекта. –

+0

Ха-ха, я предупредил вас, что это произойдет! Это потому, что вы не можете вызвать свойство 'Value' на' null'. Вам нужно сделать чек для null до вызова переменной. Я отредактирую свой ответ. – JNYRanger

+0

Я пробовал следующий код var nodelist = xDoc.Descendants(). Где (n => n.Attribute ("isRequired")! = Null). Выберите (a => a.Attribute ("isRequired").Равно ("истина")); но я получаю результат в узлах как [0] = true. как я могу получить имя узла? –

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