簡體   English   中英

如何使用 XMLReader 獲取 XML 中所有元素的內容?

[英]How to get content of all Elements in an XML using XMLReader?

我正在使用 XMLReader 讀取給定 XML 中的所有元素,但未檢索到某些元素的內容。

一個例子:

string msg = string.Empty;
using (XmlReader xReader = XmlReader.Create(new StringReader("<ns3:Failure xmlns:ns3=\"urn:xxxx\"><Code>Unauthorized</Code><Reason>Access denied</Reason><Detail>Invalid username/password.</Detail></ns3:Failure>")))
{
    while (xReader.Read())
    {
        if (xReader.NodeType == XmlNodeType.Element)
        {
            switch (xReader.Name)
            {
                case "Code":
                    msg = msg + " " + xReader.ReadElementContentAsString();
                    break;
                case "Reason":
                    msg = msg + " " + xReader.ReadElementContentAsString();
                    break;
                case "Detail":
                    msg = msg + " " + xReader.ReadElementContentAsString();
                    break;

            }
        }
    }
}

執行上述代碼后,msg 的值為“Unauthorized Invalid username/password”。
<Reason>的內容丟失。
預期值應為“未經授權的訪問被拒絕無效的用戶名/密碼”。

如何獲取所有元素的內容?

你的Reason元素被跳過了,因為在閱讀完Code的內容之后,閱讀器也移動到了下一個元素(這里: Reason ),這使得對Read的后續調用移動到另一個元素(這里: Detail )。

ReadElementAsContentString的文檔中:

此方法讀取開始標簽、元素的內容,並將閱讀器移過結束元素標簽。

解決這個問題的方法不止一種。

如果您真的想對元素名稱保持switch / case檢查,則必須確保在調用ReadElementContentAsString時不調用Read方法,例如:

using (XmlReader xReader = XmlReader.Create(new StringReader("<ns3:Failure xmlns:ns3=\"urn:xxxx\"><Reason>Access denied</Reason><Code>Unauthorized</Code><Detail>Invalid username/password.</Detail></ns3:Failure>")))
{   
    xReader.MoveToContent();
    while (!xReader.EOF)
    {
        if (xReader.NodeType == XmlNodeType.Element)
        {
            switch (xReader.Name)
            {
                case "Code":
                case "Reason":
                case "Detail":
                    msg = msg + " " + xReader.ReadElementContentAsString();
                    break;
                default:
                    xReader.Read();
                    break;
            }
        }
        else
        {
            xReader.Read();
        }
    }
}

或者,給定問題中顯示的示例,您可以連接XmlNodeType.Text類型的所有節點,例如:

string msg = string.Empty;
using (XmlReader xReader = XmlReader.Create(new StringReader("<ns3:Failure xmlns:ns3=\"urn:xxxx\"><Reason>Access denied</Reason><Code>Unauthorized</Code><Detail>Invalid username/password.</Detail></ns3:Failure>")))
{
    
    while (xReader.Read())
    {       
        if (xReader.NodeType == XmlNodeType.Text)
        {
            msg = msg + " " + xReader.ReadContentAsString();
        }
    }     
}

暫無
暫無

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

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