Foxtable(狐表)用户栏目专家坐堂 → Xml输入


  共有3273人关注过本帖树形打印复制链接

主题:Xml输入

帅哥哟,离线,有人找我吗?
bagabaga
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:138 积分:1325 威望:0 精华:0 注册:2014/3/10 19:43:00
Xml输入  发帖心情 Post By:2014/8/24 21:58:00 [只看该作者]

一、以下代码读取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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/8/24 22:10:00 [只看该作者]

 你想做什么?直接用xmlDocument来读取,然后查询,把每个<date>读出来不就行了?

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/8/24 22:13:00 [只看该作者]

 提问技巧:1、上传例子;2、说明达到的效果

 回到顶部
帅哥哟,离线,有人找我吗?
bagabaga
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:138 积分:1325 威望:0 精华:0 注册:2014/3/10 19:43:00
  发帖心情 Post By:2014/8/24 22:47:00 [只看该作者]

看运行结果,应该回到第一层,n=1,但是由于 <date date = '2014-08-09' />),n的统计出错,N=3


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/8/24 22:50:00 [只看该作者]

 上传例子,说明运行应该达到的效果

 回到顶部
帅哥哟,离线,有人找我吗?
bagabaga
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:138 积分:1325 威望:0 精华:0 注册:2014/3/10 19:43:00
  发帖心情 Post By:2014/8/25 16:23:00 [只看该作者]

附件传上,谢谢


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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


 回到顶部