2015-03-30 3 views
0

У меня есть файл xmfile, показанный ниже, где мне нужно получить все значения узлов CIName,Type,Status,FriendlyName,AccountNo. Я пытался получить результат, используя XDocument без успеха.Как получить значения из xml-файла с помощью xdocument

<?xml version="1.0" encoding="utf-8"?> 
<RetrievedeviceListResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaRevisionLevel="0" returnCode="0" status="SUCCESS" message="Success" schemaRevisionDate="2015-03-24"> 
    <instance uniquequery="file.device,logical.name=&quot;mss-abb-aejaljabelalifz-ra&quot;" query="" xmlns="http://schemas.hp.com/SM/7"> 
    <file.device type="Structure"> 
     <CIName type="String">mss-abb-aejaljabelalifz-ra</CIName> 
     <Type type="String">networkcomponents</Type> 
     <Status type="String">In use</Status> 
     <FriendlyName type="String">Jabel Ali Free Zone</FriendlyName> 
     <Company type="String">ABB - MWAN</Company> 
    </file.device> 
    <file.networkcomponents type="Structure"> 
     <AccountNo type="String">1444016683</AccountNo> 
    </file.networkcomponents> 
    <attachments xsi:nil="true" /> 
    </instance> 
    <instance uniquequery="file.device,logical.name=&quot;mss-abb-aldar-ra&quot;" query="" xmlns="http://schemas.hp.com/SM/7"> 
    <file.device type="Structure"> 
     <CIName type="String">mss-abb-aldar-ra</CIName> 
     <Type type="String">networkcomponents</Type> 
     <Status type="String">In use</Status> 
     <FriendlyName type="String">Al Dar AUH Main</FriendlyName> 
     <Company type="String">ABB - MWAN</Company> 
    </file.device> 
    <file.networkcomponents type="Structure"> 
     <AccountNo type="String">1222229614</AccountNo> 
    </file.networkcomponents> 
    <attachments xsi:nil="true" /> 
    </instance> 
<instance uniquequery="file.device,logical.name=&quot;mss-abb-aldar-rb&quot;" query="" xmlns="http://schemas.hp.com/SM/7"> 
    <file.device type="Structure"> 
     <CIName type="String">mss-abb-aldar-rb</CIName> 
     <Type type="String">networkcomponents</Type> 
     <Status type="String">In use</Status> 
     <FriendlyName type="String">Al Dar-AUH-Backup</FriendlyName> 
     <Company type="String">ABB - MWAN</Company> 
    </file.device> 
    <file.networkcomponents type="Structure"> 
     <AccountNo type="String">1222222368</AccountNo> 
    </file.networkcomponents> 
    <attachments xsi:nil="true" /> 
    </instance> 
</RetrievedeviceListResponse> 

Я использовал следующий код

XDocument xdoc = XDocument.Load(path); 
var authors = xdoc.Descendants("RetrievedeviceListResponse"); 

foreach (var author in authors) 
{ 
    Console.WriteLine("{0}{1}",author.Name, author.Value); 
} 
+1

Так что же это ваша проблема. Xml, который вы указали, недействителен. Он не имеет закрывающего тега для RetrievedeviceListResponse. Можете ли вы загрузить файл? Или, может быть, вы не можете читать ценности? –

+0

Вы изучали использование 'foreach (примеры XElement' в строке – MethodMan

ответ

1

Как о чем-то вроде:

var doc = XDocument.Load(@"C:\TestCases\test.xml"); 
     foreach (var node in doc.Descendants().Where(x => "CIName Type Status FriendlyName AccountNo".Contains(x.Name.LocalName))) 
     { 
      Console.WriteLine(string.Format("{0}:{1}", node.Name.LocalName, node.Value)); 
     } 

или чистый: LINQ

XDocument.Load(@"C:\TestCases\test.xml").Descendants().Where(x => "CIName Type Status FriendlyName AccountNo".Contains(x.Name.LocalName)).ToList().ForEach(x => Console.WriteLine(string.Format("{0}:{1}", x.Name.LocalName, x.Value))); 

Вы не закрывая свой "RetrievedeviceListResponse" в вашем XML тоже.

+0

Я отвечу на это, так как он содержит меньше строк:) – peter

+0

:) Также вы можете заменить строку поля массивом строковых полей, если у вас есть похожие поля tha t вы не хотите отображать. – Xela

0
XmlDocument doc = new XmlDocument(); 
doc.Load(path); // Where path is the location of the XML file 

XmlNodeList nodes = doc.DocumentElement.SelectNodes("RetrieveDeviceListResponse"); 

for (int i = 0; i < nodes.Count; i++) 
{ 
    Console.WriteLine("Parent Node - {0}", nodes[i].InnerText); 
    for(int j = 0; j < nodes[i].ChildNodes.Count; j++) 
    { 
     Console.WriteLine("Child Node - {0}", nodes[i].ChildNodes[j].InnerText); 
    } 
} 

ли это сделать то, что вы ищете?

+0

Мне нужны только значения 'CIName', 'Type', 'Status', 'FriendlyName', 'AccountNo' – peter

+0

XmlDocument не рекомендуется, если вы выше .NET. 3.0 XDocument - соответствующая библиотека. –

+0

Этот ответ не работает, nodes.Count равен нулю, я использую 4.5 версию – peter

1

Так может быть, вы могли бы использовать что-то вроде этого:

  const string @namespaceName = "http://schemas.hp.com/SM/7"; 
      XDocument xdoc = XDocument.Load(path); 
      var authors = xdoc.Descendants(XName.Get("instance", @namespaceName)); 

      foreach (var author in authors) 
      { 
       string ciName = author.Descendants(XName.Get("CIName", namespaceName)).First().Value; 
       string type = author.Descendants(XName.Get("Type", namespaceName)).First().Value; 
       string frendlyName = author.Descendants(XName.Get("Type", namespaceName)).First().Value; 
       string accountNo = author.Descendants(XName.Get("AccountNo", namespaceName)).First().Value; 
       Console.WriteLine("{0}, {1}, {2}, {3}", ciName, type, frendlyName, accountNo); 
      } 

Вы должны использовать это пространство имен, если вы хотите использовать этот код:

using System.Linq; 
using System.Xml.Linq; 
+0

это будет работать, но xela ответил с меньшей строкой кодов – peter

+1

все в порядке. Важно только решить вашу проблему :) –

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