Foxtable(狐表)用户栏目专家坐堂 → [求助]解析project的xml文件信息


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

主题:[求助]解析project的xml文件信息

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


加好友 发短信
等级:九尾狐 帖子:2202 积分:18124 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]解析project的xml文件信息  发帖心情 Post By:2021/7/16 6:59:00 [只看该作者]

现在有一个project导出的xml文件,想把各项工作的信息导出来。也就是<Assignments>下面的信息。
看了一下帮助里的解析xml文件,跟这个还有些区别。

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


这个文件怎么解析?

本来只需要下面的这一组信息,有很多组<TimephasedData>信息,下面是其中一个
<TimephasedData>
<Type>1</Type>
<UID>2</UID>
<Start>2021-07-13T08:00:00</Start>
<Finish>2021-07-14T08:00:00</Finish>
<Unit>2</Unit>
<Value>PT8H0M0S</Value>
</TimephasedData>

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107034 积分:544401 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/16 8:48:00 [只看该作者]

Dim xo As Foxtable.XObject = Foxtable.XObject.Parse(FileSys.ReadAllText("D:\问题\Project0715.xml"))
'Output.Show(xo.Tostring) 可以使用这个转换为json,然后按照json的方法解析即可,比如

Output.Show(xo("Assignments")("Assignment")("TimephasedData")(0)("Start").Tostring)

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


加好友 发短信
等级:九尾狐 帖子:2202 积分:18124 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/18 11:32:00 [只看该作者]

有个问题:当project导出的文件比较大时(现在的一个例子,导出的xml文件有4.5M),执行上面的代码会报错
版本:2021.5.29.1
---------------------------
代码执行出错,错误信息: 

System.InvalidOperationException: Cannot access child value on Newtonsoft.Json.Linq.JProperty.

   在 Newtonsoft.Json.Linq.JToken.get_Item(Object key)

   在 UserCode.Test()

 Dim xo As Foxtable.XObject = Foxtable.XObject.Parse(FileSys.ReadAllText(".\项目2.xml"))

For Each bm As JToken In  xo("Assignments")("Assignment")
    For Each x As JToken In bm("TimephasedData")
        Dim uid As String = x("UID").Tostring '加这一句就会报错
    next
next
[此贴子已经被作者于2021/7/18 11:52:18编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2202 积分:18124 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/18 11:51:00 [只看该作者]

实际导出的xml文件如下
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:项目2.zip


 回到顶部
帅哥,在线噢!
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107034 积分:544401 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/18 20:47:00 [只看该作者]

这个错误和文件大小没有任何关系,到了循环里说明文件已经加载了。出错是因为解析出错,TimephasedData一个数组,不是一个对象

学学怎么解析数组:http://www.foxtable.com/mobilehelp/topics/0171.htm

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


加好友 发短信
等级:九尾狐 帖子:2202 积分:18124 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/20 9:27:00 [只看该作者]

实际测试了一下。如果某一个<Assignment>里,如果有两个或以上的<TimephasedData>用上面的代码就没有问题,但如果只有一个<TimephasedData>,才会报错。这是为什么呢?
或者Assignments里只有一个Assignment,也会报错
版主说TimephasedData不是一个对象,而是一个数组,貌似没有什么区别。

<TimephasedData>
<Type>1</Type>
<UID>6</UID>
<Start>2021-07-07T08:00:00</Start>
<Finish>2021-07-08T08:00:00</Finish>
<Unit>2</Unit>
<Value>PT8H0M0S</Value>
</TimephasedData>
<TimephasedData>
<Type>1</Type>
<UID>6</UID>
<Start>2021-07-08T08:00:00</Start>
<Finish>2021-07-09T08:00:00</Finish>
<Unit>2</Unit>
<Value>PT8H0M0S</Value>
</TimephasedData>
[此贴子已经被作者于2021/7/20 9:30:56编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107034 积分:544401 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/20 9:36:00 [只看该作者]

判断一下是否数组

if typeof xo("Assignments")("Assignment")("TimephasedData") is JArray
按数组解析
else
按对象解析
endif

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


加好友 发短信
等级:九尾狐 帖子:2202 积分:18124 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/22 10:34:00 [只看该作者]

解析的时候还是有问题。就是遇到只有一个任务或者工期只安排一天的时候,解析就会报错。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:ccs.rar


 回到顶部
帅哥,在线噢!
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107034 积分:544401 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/22 10:41:00 [只看该作者]

自行调试:http://www.foxtable.com/webhelp/scr/1485.htm,看哪一句代码出错,相应做判断

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


加好友 发短信
等级:九尾狐 帖子:2202 积分:18124 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/22 11:01:00 [只看该作者]

If typeof xo("Assignments")("Assignment")("TimephasedData")   Is JArray
 Output.Show("按数组解析")
Else
Output.Show("按对象解析")
End If

执行的结果全部是("按对象解析"),就没有显示出("按数组解析")的,也就是说,执行的结果全部不是数组,没有意义

 回到顶部
总数 11 1 2 下一页