以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]解析project的xml文件信息  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=170194)

--  作者:chnfo
--  发布时间:2021/7/16 6:59:00
--  [求助]解析project的xml文件信息
现在有一个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>

--  作者:有点蓝
--  发布时间: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
--  发布时间: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
--  发布时间:2021/7/18 11:51:00
--  
实际导出的xml文件如下
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:项目2.zip


--  作者:有点蓝
--  发布时间:2021/7/18 20:47:00
--  
这个错误和文件大小没有任何关系,到了循环里说明文件已经加载了。出错是因为解析出错,TimephasedData一个数组,不是一个对象

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

--  作者:chnfo
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2021/7/20 9:36:00
--  
判断一下是否数组

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

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


--  作者:有点蓝
--  发布时间:2021/7/22 10:41:00
--  
自行调试:http://www.foxtable.com/webhelp/scr/1485.htm,看哪一句代码出错,相应做判断
--  作者:chnfo
--  发布时间:2021/7/22 11:01:00
--  
If typeof xo("Assignments")("Assignment")("TimephasedData")   Is JArray
 Output.Show("按数组解析")
Else
Output.Show("按对象解析")
End If

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