XML 节点名称和属性不可用
XML node name and attributes are not available
我有以下 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
有人知道可能是什么问题吗?
使用 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
});
代码在这里运行良好,我能够访问所有 xml 标签和属性。
也许您感到困惑,因为在每个 xmlReader.Read()
它只读取标签的一部分。所以要读取所有带有键“Chapter_1.Text1.value”的标签,first 它会读取带有 name string
and key "Chapter_1.Text1.value", 然后它读取一些没有名字的东西,没有属性,但使用 value "abc" 然后它读取以 name string
结束的标签,但没有属性也没有值。
如果你也想读取值,试试这个
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);
}
}
}
我有以下 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
有人知道可能是什么问题吗?
使用 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
});
代码在这里运行良好,我能够访问所有 xml 标签和属性。
也许您感到困惑,因为在每个 xmlReader.Read()
它只读取标签的一部分。所以要读取所有带有键“Chapter_1.Text1.value”的标签,first 它会读取带有 name string
and key "Chapter_1.Text1.value", 然后它读取一些没有名字的东西,没有属性,但使用 value "abc" 然后它读取以 name string
结束的标签,但没有属性也没有值。
如果你也想读取值,试试这个
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);
}
}
}