2016-04-13 6 views
0

I имеет следующую структуру XML:XML и атрибуты не доступны

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> 
<values> 
    <bool key="Chapter_1.Boolean1.value">true</bool> 
    <string key="Chapter_1.Text1.value">abc</string> 
    <string key="Chapter_1.Text2.value">Inspection done (2)</string> 
    <number key="Chapter_1.Number1.value">128</number> 
    <number key="Chapter_1.Number2.value">34539718</number> 
    <number key="Chapter_1.Number3.value">3</number> 
    <datetime key="Chapter_2.Chapter_2_1.DateTime1.value">2020-06-02T09:00:00+03:00</datetime> 
    <datetime key="Chapter_2.Chapter_2_1.DateTime2.value">2016-02-05T00:00:00+02:00</datetime> 
    <string key="Chapter_3.Text4.value">52</string> 
    <string key="Chapter_3.Text5.value">22</string> 
    <number key="Chapter_3.Number6.value">34539718</number> 
</values> 

и следующий C# код:

var settings = new XmlReaderSettings(); 
settings.ConformanceLevel = ConformanceLevel.Auto; 
settings.IgnoreWhitespace = true; 
settings.IgnoreComments = true; 

using (var xmlReader = new XmlTextReader(xmlFilePath)) 
{ 
    while (xmlReader.Read()) 
    { 
     var nodeName = xmlReader.Name; 
     var attrName = xmlReader.GetAttribute("key"); 
    } 
} 

Проблема заключается в том, что имя узла пусто и есть нет атрибутов для следующих ключей:

  • Chapter_1.Text1.value
  • Chapter_1.Number1.value
  • Chapter_3.Text5.value

Каждый имеет какие-либо идеи, что может быть проблема?

ответ

1

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

Может быть, вы смущены, потому что на каждом xmlReader.Read() он читает только одна часть тега. Таким образом, чтобы прочитать все метки с помощью клавиши «Chapter_1.Text1.value», первого он считывает метку с именем string и ключом «Chapter_1.Text1.value», то он читает что-то без имени, без атрибута, но с значением «abc», а затем он считывает закрытие тега с имя string, но нет атрибута и нет значения.

+0

Это был вопрос, но в конце концов я заменил свою реализацию с решением представленного Xiaoy312 (Xml в Linq). Спасибо за вашу помощь. – Sergiu

1

Было бы проще использовать Xml для Linq:

var xml = XDocument.Load(__PATH_TO_XML__); 
var values = xml.XPathSelectElements("/values/*") 
    .Select(x => new 
    { 
     Type = x.Name, 
     Key = x.Attribute("key"), 
     Value = x.Value 
    }); 
+0

Спасибо за вашу помощь. Я закончил тем, что использовал ваше решение. Кажется более интуитивным и простым в использовании. – Sergiu

0

Если вы хотите, чтобы прочитать значение, а, попробуйте этот

 using (var xmlReader = new XmlTextReader(@"yourxmlfile")) 
     { 
      while (xmlReader.Read()) 
      { 
       if (xmlReader.NodeType == XmlNodeType.Element) 
       { 

        var nodeName = xmlReader.Name; 
        var attrName = xmlReader.GetAttribute("key"); 

        Console.WriteLine(nodeName); 
        Console.WriteLine(attrName); 

       } 
       if (xmlReader.NodeType==XmlNodeType.Text) 
       { 
        Console.WriteLine(xmlReader.Value); 
       } 
      } 
     } 
Смежные вопросы