XmlTextReader 每隔一秒读取一次特定节点
XmlTextReader reads every second bulk of specific node
在下面找到我正在使用的 xml 示例和代码。当我使用 WhiteSpacehandling = None
时,从 4 本书记录中我只收到 2 本书(每隔一本书)。我发现的解决方案是使用 WhiteSpaceHandling 设置为 WhiteSpacehandling = All
- 然后我得到 4 条记录,因为在 xml 中的每一行的末尾都放置了 CR(回车 return)因此 reader当参数设置为 WhiteSpacehandling = All
时,正在使用它以某种方式正确地从 xml 中获取所有数据。不幸的是,当 XML 文件数据全部在一行时仍然存在问题,然后即使设置 WhitespaceHandling to All
也无济于事,我会每隔一本书检索一次数据(因为没有 CR)。你知道我该如何处理这个问题吗?如何即使数据放在一行中也始终获取所有数据?
XML 文件:
<bookstore>
<book genre="autobiography">
<title>Potop</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel">
<title>Faraon</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy">
<title>Ben Hur</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
<book genre="scifi">
<title>Terminator1</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
我使用的代码:
'Create the XML Reader
Dim reader = New XmlTextReader("books.xml")
reader.WhitespaceHandling = WhitespaceHandling.All 'WhitespaceHandling.None '<----------
Do While (reader.Read())
If reader.IsStartElement And reader.NodeType = XmlNodeType.Element And reader.Name = "book" Then
Console.WriteLine(reader.ReadOuterXml)
End If
End If
Loop
图片1:
图片二:
试试这个
Imports System.IO
Imports System.Xml
Module Module1
Sub Main()
Dim input As String = _
"<bookstore>" & _
"<book genre=""autobiography"">" & _
"<title>Potop</title>" & _
"<author>" & _
"<first-name>Benjamin</first-name>" & _
"<last-name>Franklin</last-name>" & _
"</author>" & _
"<price>8.99</price>" & _
"</book>" & _
"<book genre=""novel"">" & _
"<title>Faraon</title>" & _
"<author>" & _
"<first-name>Herman</first-name>" & _
"<last-name>Melville</last-name>" & _
"</author>" & _
"<price>11.99</price>" & _
"</book>" & _
"<book genre=""philosophy"">" & _
"<title>Ben Hur</title>" & _
"<author>" & _
"<name>Plato</name>" & _
"</author>" & _
"<price>9.99</price>" & _
"</book>" & _
"<book genre=""scifi"">" & _
"<title>Terminator1</title>" & _
"<author>" & _
"<name>Plato</name>" & _
"</author>" & _
"<price>9.99</price>" & _
"</book>" & _
"</bookstore>"
'Create the XML Reader
Dim sReaader As New StringReader(input)
Dim reader = New XmlTextReader(sReaader)
reader.ReadToFollowing("book")
Do While Not reader.EOF
Dim line As String = reader.ReadOuterXml
Console.WriteLine(line)
Loop
End Sub
End Module
这将解决问题 - 在这种情况下,我可以手动控制行移动,情况就是这样,因此每隔一行都会跳过。
Using reader As XmlReader = XmlReader.Create("mybooks.xml")
Do While Not reader.EOF
If reader.NodeType = XmlNodeType.Element And reader.Name = "book" And reader.IsStartElement Then
Dim line As String = reader.ReadOuterXml
Console.WriteLine(line)
Else
reader.Read()
End If
Loop
End Using
在下面找到我正在使用的 xml 示例和代码。当我使用 WhiteSpacehandling = None
时,从 4 本书记录中我只收到 2 本书(每隔一本书)。我发现的解决方案是使用 WhiteSpaceHandling 设置为 WhiteSpacehandling = All
- 然后我得到 4 条记录,因为在 xml 中的每一行的末尾都放置了 CR(回车 return)因此 reader当参数设置为 WhiteSpacehandling = All
时,正在使用它以某种方式正确地从 xml 中获取所有数据。不幸的是,当 XML 文件数据全部在一行时仍然存在问题,然后即使设置 WhitespaceHandling to All
也无济于事,我会每隔一本书检索一次数据(因为没有 CR)。你知道我该如何处理这个问题吗?如何即使数据放在一行中也始终获取所有数据?
XML 文件:
<bookstore>
<book genre="autobiography">
<title>Potop</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel">
<title>Faraon</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy">
<title>Ben Hur</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
<book genre="scifi">
<title>Terminator1</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
我使用的代码:
'Create the XML Reader
Dim reader = New XmlTextReader("books.xml")
reader.WhitespaceHandling = WhitespaceHandling.All 'WhitespaceHandling.None '<----------
Do While (reader.Read())
If reader.IsStartElement And reader.NodeType = XmlNodeType.Element And reader.Name = "book" Then
Console.WriteLine(reader.ReadOuterXml)
End If
End If
Loop
图片1:
图片二:
试试这个
Imports System.IO
Imports System.Xml
Module Module1
Sub Main()
Dim input As String = _
"<bookstore>" & _
"<book genre=""autobiography"">" & _
"<title>Potop</title>" & _
"<author>" & _
"<first-name>Benjamin</first-name>" & _
"<last-name>Franklin</last-name>" & _
"</author>" & _
"<price>8.99</price>" & _
"</book>" & _
"<book genre=""novel"">" & _
"<title>Faraon</title>" & _
"<author>" & _
"<first-name>Herman</first-name>" & _
"<last-name>Melville</last-name>" & _
"</author>" & _
"<price>11.99</price>" & _
"</book>" & _
"<book genre=""philosophy"">" & _
"<title>Ben Hur</title>" & _
"<author>" & _
"<name>Plato</name>" & _
"</author>" & _
"<price>9.99</price>" & _
"</book>" & _
"<book genre=""scifi"">" & _
"<title>Terminator1</title>" & _
"<author>" & _
"<name>Plato</name>" & _
"</author>" & _
"<price>9.99</price>" & _
"</book>" & _
"</bookstore>"
'Create the XML Reader
Dim sReaader As New StringReader(input)
Dim reader = New XmlTextReader(sReaader)
reader.ReadToFollowing("book")
Do While Not reader.EOF
Dim line As String = reader.ReadOuterXml
Console.WriteLine(line)
Loop
End Sub
End Module
这将解决问题 - 在这种情况下,我可以手动控制行移动,情况就是这样,因此每隔一行都会跳过。
Using reader As XmlReader = XmlReader.Create("mybooks.xml")
Do While Not reader.EOF
If reader.NodeType = XmlNodeType.Element And reader.Name = "book" And reader.IsStartElement Then
Dim line As String = reader.ReadOuterXml
Console.WriteLine(line)
Else
reader.Read()
End If
Loop
End Using