C# XMLReader IsElementEmpty是错误的
因此,我正在构建一个小的Windows窗体应用程序,它允许您从MSMQ队列中选择一条消息,然后在对话框窗体上的格式良好的查看器中显示XML消息。对话框窗体使用富文本框控件 消息主体读入XMlDocument后。我创建了此扩展方法以添加换行符和格式: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()
<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函数将正常工作