首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLReader读取属性

XMLReader读取属性
EN

Stack Overflow用户
提问于 2015-10-30 22:57:18
回答 2查看 1.8K关注 0票数 2

我正在将一个字典序列化为xml,它可以很好地工作,并按如下方式生成每个条目:

代码语言:javascript
复制
  <Parameters>
    <item key="Input" value="CLOCK_SYNC" />
    <item key="Output" value="NTP_SYNC" />
    <item key="TimeSpan" value="00:00:30" />
  </Parameters>

然而,尝试对其进行反序列化让我对xml阅读器感到头疼,我试图遍历项目元素并读回属性,但我无法使用以下代码做到这一点。我已经尝试了各种方法来遍历,但都没有成功,我接近于一个字符一个字符地解析,并让它以这种方式工作,但我确信我忽略了一些东西。

代码语言:javascript
复制
    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。

EN

回答 2

Stack Overflow用户

发布于 2015-10-30 23:21:54

现在通过大量额外的读取修复了它,但它仍然有效,仍然对ReadStartElement和MoveToContent感到困惑,但是哦,好吧。

代码语言:javascript
复制
    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();
        }
    }
票数 2
EN

Stack Overflow用户

发布于 2020-05-19 03:42:28

XMLReader对元素的处理顺序非常讲究。您输入一个元素,读取它的值/内容,然后读取它的属性。

此外,没有end元素也会使XMLReader生气,因为您不能这样做:

代码语言:javascript
复制
reader.ReadStartElement("item")
'Do work
reader.ReadEndElement()

下面的示例是如何在没有值/内容的特定元素中导航。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33438908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档