gpt4 book ai didi

c# - 如何让 XmlReader 读取 C# 中的属性?

转载 作者:行者123 更新时间:2023-12-03 23:44:15 25 4
gpt4 key购买 nike

我有一个包含以下 XML 内容的 XML-Stream:

<WebError Key="A">
<Message>B</Message>
<Parameters>
<Parameter name="C">D</Parameter>
</Parameters>
</WebError>

我找不到让 XmlReader 读取到 Key 属性的方法,因此 reader.NodeTypeXmlNodeType.Attributereader.LocalName"Key"

这就是我初始化 XmlReader 的方式:

XmlReader.Create(stream, new XmlReaderSettings { CloseInput = true, IgnoreWhitespace = true });

然后这个阅读器会通过几个方法级别,直到它到达我的解析器函数。

这是我试图让读者阅读该元素的所有替代代码。从代码中剥离了控制结构,因此您只能看到实际调用的函数。

第一次尝试,通过 MoveToFirstAttribute() 调用移动到属性:

reader.Read(); // true
reader.IsStartElement("WebError"); // true
using (var nodeReader = reader.ReadSubtree()) {
nodeReader.HasAttributes; // true
nodeReader.MoveToFirstAttribute(); // false
nodeReader.Read(); // true
nodeReader.NodeType; // XmlNodeType.Element
nodeReader.LocalName; // "WebError"
using (var subLevelReader = nodeReader.ReadSubtree()) {
}
nodeReader.Read(); // false
}

很明显,MoveToFirstAttribute 不会移动读者。作为副作用,通常用于解析内部 XmlElement 节点的 subLevelReader 现在会抓取整个 WebError 节点,并且当 subLevelReader 被处理,整个 WebError 节点被跨过。

第二次尝试,调用MoveToContent()并搜索属性:

reader.Read(); // true
reader.IsStartElement("WebError"); // true
using (var nodeReader = reader.ReadSubtree()) {
nodeReader.MoveToContent(); // XmlNodeType.Element
nodeReader.LocalName; // "WebError"
nodeReader.Read(); // true
nodeReader.NodeType; // XmlNodeType.Element
nodeReader.LocalName; // "Message"
...
}

显然,当我调用 MoveToContent() 时,我已经进步太多了,因为它移动到了 WebError 起始标记的末尾。

第三次尝试,调用MoveToContent()前读取属性:

reader.Read(); // true
reader.IsStartElement("WebError"); // true
using (var nodeReader = reader.ReadSubtree()) {
nodeReader.MoveToAttribute("Key"); // false
nodeReader.MoveToContent(); // XmlNodeType.Element
nodeReader.LocalName; // "WebError"
nodeReader.Read(); // true
nodeReader.NodeType; // XmlNodeType.Element
nodeReader.LocalName; // "Message"
...
}

这也不起作用。那么,如何到达 WebError@Key 节点?

最佳答案

This question (不幸的是,它没有出现在“xmlreader c# 属性”的搜索结果中)包含 an answer这让我明白了这个问题: Read() 不会将读者定位在一个属性上。您首先移动到一个元素,然后移动到它的内容,然后移动到它的属性。只有这个命令有效。

结果 所有如果你调用 MoveToContent() before MoveToAttribute("Key"),我的方法都有效, MoveToNextAttribute()MoveToFirstAttribute(),但不是 Read(),因为它读取到 Message 节点.

所以这是实际的代码:

while (reader.Read()) {
if (!reader.IsStartElement("WebError")) { continue; }

// We found the WebError node
using (var nodeReader = reader.ReadSubtree()) {
nodeReader.MoveToContent();

// Read the attributes
while (nodeReader.MoveToNextAttribute()) {
var nodeName = nodeReader.LocalName;
if (nodeName == "Key") {
m_Key = nodeReader.Value; // "A"
break;
}
}

// Read the XML sub nodes
while (nodeReader.Read()) {
if (nodeReader.NodeType != XmlNodeType.Element) { continue; }

using (var subLevelReader = nodeReader.ReadSubtree()) {
// Parse sub levels of XML (Message, Parameters)
}
}
}
}

关于c# - 如何让 XmlReader 读取 C# 中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37863344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com