【问题标题】:Issue with XML parsing in IBMi (XMLTABLE) xmlIBMi (XMLTABLE) xml 中的 XML 解析问题
【发布时间】:2020-03-11 13:44:27
【问题描述】:

我正在尝试解析具有以下结构的 XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<x12:ASC856_004010 xmlns:x12="http://abcd.com">
    <ApplicationArea>
        <CreationDateTime>2019-11-01T18:37:39.000Z</CreationDateTime>
        <DocType>TST</DocType>
    </ApplicationArea>
</x12:ASC856_004010>

当我将 x12:ASC856 作为根节点并附加名称时,我不确定如何解析它。我知道我可以使用 XMLTABLE 指定名称空间来使用 XSD 验证 XML。为了简化解析,我暂时将 XML 更改为如下所示

<LoadValues>
    <ApplicationArea>
        <CreationDateTime>2019-11-01T18:37:39.000Z</CreationDateTime>
        <DocType>TST</DocType>
    </ApplicationArea>
</LoadValues>

它会用下面的查询愉快地解析它。

Select T1.* FROM Xmltable('$d/LoadValues' Passing Xmlparse(Document XML_Input) as "d" COLUMNS
DocType Varchar(10) Path '/ApplicationArea/DocType' ) as T1

谁能帮我理解这个 x12:ASC856 表示什么?

当我解析原始 XML 时,出现以下错误

在 SQL 处理期间 XML 解析失败。转换为UTF-8后正在处理的XML值的字节偏移量为6。XML解析器错误描述为:处理指令目标匹配“[xX][mM][lL]”是不允许的。恢复 。 . . : 更正 XML 值。再次尝试请求。

【问题讨论】:

  • x12 是一个命名空间
  • 错误消息似乎是在抱怨

标签: xml db2 xmltable


【解决方案1】:

此独立示例适用于 zOS 10:

Select T1.* FROM Xmltable(
XMLNAMESPACES('http://abcd.com' AS "x12"), 
'$d/x12:ASC856_004010' 
PASSING XMLPARSE(DOCUMENT 
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<x12:ASC856_004010 xmlns:x12="http://abcd.com">
  <ApplicationArea>
    <CreationDateTime>2019-11-01T18:37:39.000Z</CreationDateTime>
    <DocType>TST</DocType>
  </ApplicationArea>
</x12:ASC856_004010>'
) as "d"
COLUMNS
   CreationDateTime TIMESTAMP Path 'ApplicationArea/CreationDateTime',
   DocType Varchar(10) Path 'ApplicationArea/DocType'
) as T1
  • 添加了 XMLNAMESPACES 声明
  • 将 x12 命名空间添加到 行 xquery 表达式

【讨论】:

  • 感谢 stavr00 的回答。它对我有用。
【解决方案2】:

似乎 DB2 for IBM i(至少我的 7.3)不接受 XML prolog。
以下内容按原样工作,但在未注释序言的情况下无法正常工作。

SELECT T1.*
FROM 
(
VALUES XMLPARSE
(
DOCUMENT 
'<!-- <?xml version="1.0" encoding="UTF-8" standalone="yes"?> -->
<x12:ASC856_004010 xmlns:x12="http://abcd.com">
  <ApplicationArea>
    <CreationDateTime>2019-11-01T18:37:39.000Z</CreationDateTime>
    <DocType>TST</DocType>
  </ApplicationArea>
</x12:ASC856_004010>'
)
) V(X)
, XMLTABLE
(
  XMLNAMESPACES('http://abcd.com' AS "x12")
, '$d/x12:ASC856_004010' 
PASSING V.X as "d"
COLUMNS
   CreationDateTime TIMESTAMP   Path 'ApplicationArea/CreationDateTime',
   DocType          Varchar(10) Path 'ApplicationArea/DocType'
) as T1;

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 2014-08-14
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多