我正在将一个字典序列化为xml,它可以很好地工作,并按如下方式生成每个条目:
<Parameters>
<item key="Input" value="CLOCK_SYNC" />
<item key="Output" value="NTP_SYNC" />
<item key="TimeSpan" value="00:00:30" />
</Parameters>然而,尝试对其进行反序列化让我对xml阅读器感到头疼,我试图遍历项目元素并读回属性,但我无法使用以下代码做到这一点。我已经尝试了各种方法来遍历,但都没有成功,我接近于一个字符一个字符地解析,并让它以这种方式工作,但我确信我忽略了一些东西。
public void ReadXml(System.Xml.XmlReader reader)
{
bool wasEmpty = reader.IsEmptyElement;
reader.MoveToContent();
if (wasEmpty)
return;
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
reader.MoveToAttribute("key");
string key = reader.GetAttribute("key");
reader.MoveToAttribute("value");
string value = reader.GetAttribute("value");
this.Add(key, value);
reader.MoveToContent();
}当我无法解析属性时,它会出错,它们都返回Null。
发布于 2015-10-30 23:21:54
现在通过大量额外的读取修复了它,但它仍然有效,仍然对ReadStartElement和MoveToContent感到困惑,但是哦,好吧。
public void ReadXml(System.Xml.XmlReader reader)
{
bool wasEmpty = reader.IsEmptyElement;
// jump to <parameters>
reader.Read();
if (wasEmpty)
return;
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
// jump to <item>
reader.MoveToContent();
reader.MoveToAttribute("key");
string key = reader.GetAttribute("key");
reader.MoveToAttribute("value");
string value = reader.GetAttribute("value");
this.Add(key, value);
reader.ReadStartElement("item");
reader.MoveToContent();
}
}发布于 2020-05-19 03:42:28
XMLReader对元素的处理顺序非常讲究。您输入一个元素,读取它的值/内容,然后读取它的属性。
此外,没有end元素也会使XMLReader生气,因为您不能这样做:
reader.ReadStartElement("item")
'Do work
reader.ReadEndElement()下面的示例是如何在没有值/内容的特定元素中导航。
reader.ReadStartElement("Parameters")
While reader.NodeType <> System.Xml.XmlNodeType.EndElement
Select Case reader.NodeType
Case Xml.XmlNodeType.Element
If reader.Name <> "item" Then
reader.ReadToNextSibling("item")
Continue While
End If
Dim key As TKey
Dim value As TValue
If (reader.HasAttributes) Then
reader.MoveToFirstAttribute()
key = Convert.ChangeType(reader.GetAttribute("key"), GetType(TKey))
value = Convert.ChangeType(reader.GetAttribute("value"), GetType(TValue))
End If
Me.Add(key, value)
reader.MoveToContent()
Case Else
reader.ReadToNextSibling("item")
Continue While
End Select
End While
reader.ReadEndElement()https://stackoverflow.com/questions/33438908
复制相似问题