【问题标题】:XML node name and attributes are not availableXML 节点名称和属性不可用
【发布时间】:2016-04-13 15:26:43
【问题描述】:

我有以下 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

有人知道可能是什么问题吗?

【问题讨论】:

    标签: c# xml xmlreader


    【解决方案1】:

    代码在这里运行良好,我能够访问所有 xml 标记和属性。

    也许你会感到困惑,因为在每个xmlReader.Read() 它只读取标签的一部分。因此,要读取所有带有键“Chapter_1.Text1.value”的标签,first 它会读取带有名称string 和键“Chapter_1”的标签.Text1.value",然后它读取没有名称,没有属性,但具有 value "abc" 的内容,然后读取以 结尾的标签名称string,但没有属性也没有值。

    【讨论】:

    • 这是问题所在,但最后我用Xiaoy312(Xml to Linq)提供的解决方案替换了我的实现。感谢您的帮助。
    【解决方案2】:

    使用 Xml to 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
        });
    

    【讨论】:

    • 感谢您的帮助。我最终使用了您的解决方案。看起来更直观,更易于使用。
    【解决方案3】:

    如果你也想读取值,试试这个

          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);
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多