以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  Xml输入  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=55847)

--  作者:bagabaga
--  发布时间:2014/8/24 21:58:00
--  Xml输入
一、以下代码读取exp.xml;
1、n表示xml Element的嵌套层数,每进入一个嵌套n=n+1
2、m表示Attribute的次序
3、程序用来显示Element的嵌套关系。
4、去掉 <data date=\'2014-8-24\' /> <data date=\'2014-9-24\' />  这二行,输出的嵌套关系是正常的,最后返回到{0}
5、遇到Xml文件中有短结尾 ‘/>\' 的时候,(例如<date date = \'2014-08-09\' />),代码读不到EndElement  ‘/>’   嵌套关系就出错。

请教如何能够改这段程序,读取有 “/>"情况下的嵌套关系


程序
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:代码.rar


Using reader As System.XML.XmlReader = System.XML.XmlReader.Create("exp.xml")
  \' Move the reader to the second book node.
  reader.MoveToContent()

  reader.ReadToDescendant("book")
  \'reader.Skip() \'Skip the first book.
  \' Parse the file starting with the second book node.
    Dim n As Integer = 0
  Do
    Select Case reader.NodeType
      Case System.XML.XmlNodeType.Element
        n=n+1
        output.show("<{" & n & "}" & reader.Name)

        Dim m As Integer = 1
        While reader.MoveToNextAttribute()
            output.show(" {" & n & "}=\'{" & m & "}\'"& reader.Name & ": " & reader.Value)
            m=m+1
        End While
        output.show(">")

      Case System.XML.XmlNodeType.Text
        output.show(reader.Value)
      Case System.XML.XmlNodeType.EndElement
        output.show("</{" & n & "}>" & reader.Name)
        n=n-1
    End Select
  Loop While reader.Read()

End Using

二、exp.xml:

<!--sample XML fragment-->
<bookstore>
  <book genre=\'novel\' ISBN=\'10-861003-324\'>
    <data date=\'2014-8-24\' />
    <title>The Handmaid\'s Tale</title>
    <price>19.95</price>
  </book>
  <book genre=\'novel\' ISBN=\'1-861001-57-5\'>
   <data date=\'2014-9-24\' />
    <title>Pride And Prejudice</title>
    <price>24.95</price>
  </book>
</bookstore>

三、运行结果:
<{1}bookstore
>
<{2}date
 {2}=\'{1}\'date: 2014-08-09
>
<{3}book
 {3}=\'{1}\'genre: novel
 {3}=\'{2}\'ISBN: 10-861003-324
>
<{4}title
>
The Handmaid\'s Tale
</{4}>title
<{4}price
>
19.95
</{4}>price
</{3}>book
<{3}date
 {3}=\'{1}\'date: 2014-09-09
>
<{4}book
 {4}=\'{1}\'genre: novel
 {4}=\'{2}\'ISBN: 1-861001-57-5
>
<{5}title
>
Pride And Prejudice
</{5}>title
<{5}price
>
24.95
</{5}>price
</{4}>book
</{3}>bookstore

[此贴子已经被作者于2014-8-25 16:19:39编辑过]

--  作者:有点甜
--  发布时间:2014/8/24 22:10:00
--  
 你想做什么?直接用xmlDocument来读取,然后查询,把每个<date>读出来不就行了?
--  作者:有点甜
--  发布时间:2014/8/24 22:13:00
--  
 提问技巧:1、上传例子;2、说明达到的效果
--  作者:bagabaga
--  发布时间:2014/8/24 22:47:00
--  
看运行结果,应该回到第一层,n=1,但是由于 <date date = \'2014-08-09\' />),n的统计出错,N=3


--  作者:有点甜
--  发布时间:2014/8/24 22:50:00
--  
 上传例子,说明运行应该达到的效果
--  作者:bagabaga
--  发布时间:2014/8/25 16:23:00
--  
附件传上,谢谢


--  作者:有点甜
--  发布时间:2014/8/25 17:06:00
--  

 测试了一下,好像没有找到通用的方法,对于不符合规范的,你只能特殊的额外的处理一下

 

Using reader As System.XML.XmlReader = System.XML.XmlReader.Create("d:\\exp.xml")

\' Move the reader to the second book node.
reader.MoveToContent()

reader.ReadToDescendant("book")
\'reader.Skip() \'Skip the first book.
\' Parse the file starting with the second book node.
Dim n As Integer = 0
Do
    Select Case reader.NodeType
        Case System.XML.XmlNodeType.Element
           
            n=n+1
           
            output.show("<{" & n & "}" & reader.Name)
            Dim temp As String = reader.Name

            Dim m As Integer = 1
            While reader.MoveToNextAttribute()
                output.show(" {" & n & "}=\'{" & m & "}\'"& reader.Name & ": " & reader.Value)
                m=m+1
            End While
            output.show(">")

            If temp = "data" Then
                output.show("</{" & n & "}>" & reader.Name)
                n=n-1
            End If

        Case System.XML.XmlNodeType.Text
            output.show(reader.Value)
        Case System.XML.XmlNodeType.EndElement
            output.show("</{" & n & "}>" & reader.Name)
            n=n-1
    End Select
Loop While reader.Read()

End Using