簡體   English   中英

如何使XmlReader讀取C#中的屬性?

[英]How to make an XmlReader read the attributes in C#?

我有一個XML-Stream,其中包含以下XML內容:

<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不會移動閱讀器。 作為副作用subLevelReader是通常用於分析內XmlElement節點現在抓住整個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節點?

這個問題 (不幸的是, 該問題未出現在“ xmlreader c#屬性”的搜索結果中)包含一個答案 ,使我理解了這個問題: Read()不會將閱讀器定位在一個屬性上。 您首先移至元素,然后移至其內容,然后移至其屬性。 僅此命令有效。

如果您 MoveToAttribute("Key")MoveToNextAttribute()MoveToFirstAttribute() MoveToContent() 之前調用MoveToContent() ,但尚未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)
      }
    }
  }
}

最簡單的方法是使用ReadToFollowingGetAttribute方法。

reader.ReadToFollowing("WebError");
string keyAttr = reader.GetAttribute("Key");

暫無
暫無

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

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