C# XMLReader IsElementEmpty是错误的

C# XMLReader IsElementEmpty是错误的,c#,xml,vb.net,xml-parsing,C#,Xml,Vb.net,Xml Parsing,因此,我正在构建一个小的Windows窗体应用程序,它允许您从MSMQ队列中选择一条消息,然后在对话框窗体上的格式良好的查看器中显示XML消息。对话框窗体使用富文本框控件 消息主体读入XMlDocument后。我创建了此扩展方法以添加换行符和格式: <Extension()> Public Function Beautify(doc As XmlDocument) As String Dim sb As New StringBuilder()

因此,我正在构建一个小的Windows窗体应用程序,它允许您从MSMQ队列中选择一条消息,然后在对话框窗体上的格式良好的查看器中显示XML消息。对话框窗体使用富文本框控件

消息主体读入XMlDocument后。我创建了此扩展方法以添加换行符和格式:

    <Extension()>
    Public Function Beautify(doc As XmlDocument) As String
        Dim sb As New StringBuilder()
        Dim settings As New XmlWriterSettings()
        With settings
            .Indent = True
            .IndentChars = "     "
            .NewLineChars = Environment.NewLine
            .NewLineHandling = NewLineHandling.Replace
            .Encoding = New UTF8Encoding(False)
        End With

        Using writer As XmlWriter = XmlWriter.Create(sb, settings)
            If TypeOf doc.ChildNodes(0) Is XmlProcessingInstruction Then
                doc.RemoveChild(doc.ChildNodes(0))
            End If

            doc.Save(writer)
            Return sb.ToString()
        End Using
    End Function

公共函数美化(doc为XmlDocument)为字符串
使某人成为新的架线工
作为新XmlWriterSettings()的Dim设置
设置
.Indent=True
.IndentChars=“”
.NewLineChars=Environment.NewLine
.NewLineHandling=NewLineHandling.Replace
.Encoding=新的UTF8编码(False)
以
使用writer作为XmlWriter=XmlWriter.Create(sb,设置)
如果doc.ChildNodes(0)的类型为XmlProcessingInstruction,则
doc.RemoveChild(doc.ChildNodes(0))
如果结束
保存文档(编写器)
把某人送回原处
终端使用
端函数
我创建了一个列表(字符串),以便可以选择多条消息,然后将其传递到对话框窗体的自定义构造函数中:

Public Sub New(lMessages As List(Of String))

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Dim strLastMessage As String = lMessages.Last()
    For Each strMessage As String In lMessages
        Using reader As XmlReader = XmlReader.Create(New StringReader(strMessage))
            While reader.Read()
                Select Case reader.NodeType
                    Case XmlNodeType.XmlDeclaration
                        Me.rtbMessage.SelectionColor = Color.Blue
                        Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                        Me.rtbMessage.AppendText("<? " & reader.Name & " " & reader.Value & " ?>")

                    Case XmlNodeType.Element
                        Me.rtbMessage.SelectionColor = Color.Blue
                        Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                        Me.rtbMessage.AppendText("<")
                        Me.rtbMessage.SelectionColor = Color.Brown
                        Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                        Me.rtbMessage.AppendText(reader.Name)
                        If reader.HasAttributes Then
                            While reader.MoveToNextAttribute()
                                Me.rtbMessage.SelectionColor = Color.Brown
                                Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                                Me.rtbMessage.AppendText(" " & reader.Name)
                                Me.rtbMessage.SelectionColor = Color.Blue
                                Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                                Me.rtbMessage.AppendText("=" & Chr(34))
                                Me.rtbMessage.SelectionColor = Color.Black
                                Me.rtbMessage.SelectionFont = New Font(Me.rtbMessage.Font, FontStyle.Bold)
                                Me.rtbMessage.AppendText(reader.Value)
                                Me.rtbMessage.SelectionColor = Color.Blue
                                Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                                Me.rtbMessage.AppendText(Chr(34))
                            End While
                        End If
                        If reader.IsEmptyElement = True Then
                            Me.rtbMessage.SelectionColor = Color.Blue
                            Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                            Me.rtbMessage.AppendText(" />")
                        Else
                            Me.rtbMessage.SelectionColor = Color.Blue
                            Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                            Me.rtbMessage.AppendText(">")
                        End If

                    Case XmlNodeType.Text
                        Me.rtbMessage.SelectionColor = Color.Black
                        Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                        Me.rtbMessage.AppendText(reader.Value)

                    Case XmlNodeType.EndElement
                        Me.rtbMessage.SelectionColor = Color.Blue
                        Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                        Me.rtbMessage.AppendText("</")
                        Me.rtbMessage.SelectionColor = Color.Brown
                        Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                        Me.rtbMessage.AppendText(reader.Name)
                        Me.rtbMessage.SelectionColor = Color.Blue
                        Me.rtbMessage.SelectionFont = Me.rtbMessage.Font
                        Me.rtbMessage.AppendText(">")

                    Case XmlNodeType.Whitespace
                        Me.rtbMessage.AppendText(reader.Value)
                End Select
            End While
        End Using

        If strMessage <> strLastMessage Then
            Me.rtbMessage.AppendText(Chr(13) & Chr(10))
            Me.rtbMessage.AppendText(Chr(13) & Chr(10))
        End If
    Next
    Me.rtbMessage.Select(0, 0)
End Sub
Public Sub-New(消息作为列表(字符串))
'设计器需要此调用。
初始化组件()
'在InitializeComponent()调用之后添加任何初始化。
Dim strLastMessage As String=lMessages.Last()
对于每个strMessage,将其作为lmessage中的字符串
将reader用作XmlReader=XmlReader.Create(新StringReader(strMessage))
而reader.Read()
选择Case reader.NodeType
案例XmlNodeType.XmlDeclaration
Me.rtbMessage.SelectionColor=Color.Blue
Me.rtbMessage.SelectionFont=Me.rtbMessage.Font
Me.rtbMessage.AppendText(“”)
Case XmlNodeType.Element
Me.rtbMessage.SelectionColor=Color.Blue
Me.rtbMessage.SelectionFont=Me.rtbMessage.Font
Me.rtbMessage.AppendText(“”)
其他的
Me.rtbMessage.SelectionColor=Color.Blue
Me.rtbMessage.SelectionFont=Me.rtbMessage.Font
Me.rtbMessage.AppendText(“>”)
如果结束
Case XmlNodeType.Text
Me.rtbMessage.SelectionColor=Color.Black
Me.rtbMessage.SelectionFont=Me.rtbMessage.Font
Me.rtbMessage.AppendText(reader.Value)
案例XmlNodeType.EndElement
Me.rtbMessage.SelectionColor=Color.Blue
Me.rtbMessage.SelectionFont=Me.rtbMessage.Font
Me.rtbMessage.AppendText(“”)
大小写XmlNodeType.Whitespace
Me.rtbMessage.AppendText(reader.Value)
结束选择
结束时
终端使用
如果是strMessage strLastMessage,则
Me.rtbMessage.AppendText(Chr(13)和Chr(10))
Me.rtbMessage.AppendText(Chr(13)和Chr(10))
如果结束
下一个
Me.rtbMessage.Select(0,0)
端接头
现在,除了自动关闭元素没有得到一个关闭“/>”之外,大多数操作都非常有效。我想我的If-Then语句在其中检查reader.IsEmptyElement会起作用,但它不会

以下是一个示例XML文件:

<Animal type="Mammal">
    <Classifications>
        <Classify name="CommonName" value="Dog" />
        <Classify name="Environment" value="Land" />
        <Classify name="NumLegs" value="4" />
    </Classifications>
</Animal>

如果运行我的代码,您将看到“Classify”元素在没有标记关闭的情况下呈现


任何帮助都将不胜感激!如果你对C#更了解,那么用这种语言编写一个解决方案也不错。我可以皈依

我想我找到了自己的问题!哈哈

只需补充:

reader.MoveToElement()
在我读完所有元素属性之后。读取器不再位于元素上,而是位于最后一个属性上,因此IsEmptyElement为False。如果我移回元素,IsEmptyElement函数将正常工作