[英]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.