2016-05-18 5 views
0

У меня есть XML, который выглядит следующим образом:Невозможно прочитать XML «значение»

<PackageConstruct900 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ID>{5209724e-1c5a-4d84-962e-371271c3836c}</ID> 
    <ParentID /> 
    <Name /> 
    <Type>Package</Type> 
    <Tasks> 
    <anyType xsi:type="Task"> 
     <ID>{4c97132c-ba7d-4fba-9b01-333976e9ad22}</ID> 
     <ParentID>{E893A7FD-2758-4315-9181-93F8728332E5}</ParentID> 
     <Name>ProcessAgility</Name> 
     <Type>Task</Type> 
     <StartedOn>1900-01-01T00:00:00</StartedOn> 
     <EndedOn>1900-01-01T00:00:00</EndedOn> 
    </anyType> 
    </Tasks> 
</PackageConstruct900> 

Я пытаюсь захватить значение второго узла «Name» («ProcessAgility»).

Но (XmlReader) reader.Value возвращает пустую строку, когда я прихожу к этому узлу. Как захватить ТЕКСТ, который падает между <nodeName>TEXT</nodeName>?

Вот мой код до сих пор:

XmlReader reader = XmlReader.Create(pathToFile, settings); 

reader.MoveToContent(); 
while (reader.Read()) 
{ 
    switch (reader.NodeType) 
    { 
     case XmlNodeType.Text: 
      break; 
     case XmlNodeType.Element:       
      switch (reader.Name) 
      { 
       case "anyType": 
        newJob = true; 
        break; 
       case "AML": 
        string ss = string.Empty; 
        ss = reader.ReadInnerXml(); 
        ss = System.Net.WebUtility.HtmlDecode(ss); 
        rs = XmlReader.Create(ss, settings); 
        break; 
       case "Name": 
        if (newJob && reader.HasValue) 
        { 
         jobName = reader.Value; 
        } 
        if (!string.IsNullOrWhiteSpace(jobName)) 
        { 
         if (!jobsAdded.Contains(jobName)) 
         { 
          jobsAdded.Add(jobName); 
         } 
        } 
        break; 
       case "Tasks": 
        m_ConvertingTask = true; 
        break; 
       case "TRIGGERS": 
        break; 
      } 
      break; 
    } 
} 
+0

Какой язык программирования вы используете? Добавьте соответствующий тег. – choroba

+0

О, да, мой плохой. Я использую C# – Chewdoggie

+0

Пример кода того, что вы пробовали до сих пор? – edtheprogrammerguy

ответ

2

Попробуйте использовать XmlDocument, то вы можете использовать XPath навигации, как это:/PackageConstruct900/Задачи/anyType/Имя

 XmlDocument doc = new XmlDocument(); 
     doc.LoadXml("<PackageConstruct900 xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n <ID>{5209724e-1c5a-4d84-962e-371271c3836c}</ID>\r\n <ParentID />\r\n <Name />\r\n <Type>Package</Type>\r\n <Tasks>\r\n <anyType xsi:type=\"Task\">\r\n  <ID>{4c97132c-ba7d-4fba-9b01-333976e9ad22}</ID>\r\n  <ParentID>{E893A7FD-2758-4315-9181-93F8728332E5}</ParentID>\r\n  <Name>ProcessAgility</Name>\r\n  <Type>Task</Type>\r\n  <StartedOn>1900-01-01T00:00:00</StartedOn>\r\n  <EndedOn>1900-01-01T00:00:00</EndedOn>\r\n </anyType>\r\n </Tasks>\r\n</PackageConstruct900>"); 
     XmlNode root = doc.DocumentElement; 
     XmlNode node = root.SelectSingleNode(
      "/PackageConstruct900/Tasks/anyType/Name"); 
     Console.WriteLine(node.InnerXml); 

Это даст вам первый узел, если вы хотите перечислить его итерацию, вы можете использовать:

 XmlNodeList nodes = root.SelectNodes("/PackageConstruct900/Tasks"); 
     foreach (XmlNode node in nodes) 
     { 
      var typename = node.SelectSingleNode("anyType/Name"); 
      Console.WriteLine(typename.InnerXml);  
     }    
+0

Не было бы проще использовать 'doc.GetElementsByTagName (" Name ")'? –

+0

Я использовал идею montelof для «InnerXML» для моего объекта-читателя. То есть, reader.ReadInnerXML(), похоже, получает необходимую мне информацию. – Chewdoggie

0

Очень простой (и очень специфичный) в) System.Xml.Linq.XElement решение будет:

string processAgility = XElement.Parse(File.ReadAllText(pathToFile)) 
    .Element("Tasks") 
    .Element("anyType") 
    .Element("Name") 
    .Value; 

Или, если вы включите using System.Xml.XPath директиву, вы можете использовать XPath natigation с помощью метода XPathSelectElement расширения:

string processAgility = XElement.Parse(File.ReadAllText(pathToFile)) 
    .XPathSelectElement("Tasks/anyType/Name") 
    .Value; 
Смежные вопросы