簡體   English   中英

XMLReader 讀取屬性

[英]XMLReader read attributes

我正在將字典序列化為 xml,它工作正常並按如下方式生成每個項目:

  <Parameters>
    <item key="Input" value="CLOCK_SYNC" />
    <item key="Output" value="NTP_SYNC" />
    <item key="TimeSpan" value="00:00:30" />
  </Parameters>

然而,試圖反序列化這讓我對 xml 閱讀器感到有些頭疼,我試圖遍歷 item 元素並讀回屬性,但我無法使用以下代碼這樣做。 我嘗試了各種方法來迭代,但在這兩種情況下都沒有成功,我接近於逐個字符地解析並使其以這種方式工作,但我確定我忽略了一些東西

    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。

現在通過大量額外讀取修復了它,但它起作用了,仍然對 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();
        }
    }

XMLReader 非常注重處理元素的順序。 你輸入一個元素,讀取它的值/內容,然后讀取它的屬性。

此外,沒有結束元素也會讓 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM