0

下面的代码很好地适用于非整数。
我有几个带有整数的标签(比如<1><2>),

SET serveroutput ON
alter session set cursor_sharing = exact;
with xmldata(d) as (select xmltype('<ROWSET><ROW><1>ABC</1></ROW></ROWSET>') from dual
)
select x.*
FROM xmldata,
     xmltable('ROWSET/ROW' passing xmldata.d
              columns
              name varchar2(10) path '1'
     ) x
;

我也尝试过使用它:

DECLARE
l_xml xmltype;
l_val VARCHAR2(1000) := '<ROWSET><ROW><1>ABC</1></ROW></ROWSET>';
BEGIN
     l_xml        := xmltype(l_val);
end;

两者都会导致以下错误:

Error report:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00231: invalid character 49 ('1') found in a Name or Nmtoken
Error at line 1
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 5
31011. 00000 -  "XML parsing failed"
*Cause:    XML parser returned an error while trying to parse the document.
*Action:   Check if the document to be parsed is valid.

在此先感谢和赞赏:)

4

2 回答 2

3

错误:

LPX-00231: invalid character 49 ('1') found in a Name or Nmtoken

是因为在您的 XML 中有一个元素1

<1>ABC</1>

where<1>是一个开始标签(并且</1>是一个结束标签)。在标签1中是给出元素类型的名称。名称有一定的命名规则

[定义:名称是一个以字母或几个标点字符之一开头,并以字母、数字、连字符、下划线、冒号或句号结尾的记号,统称为名称字符。] 以字符串 " 开头的名称xml" 或任何匹配 (('X'|'x') ('M'|'m') ('L'|'l')) 的字符串,都保留用于此版本或未来版本的标准化本规范。

Name 的第一个字符必须是 NameStartChar,其他任何字符都必须是 NameChars;此机制用于防止名称以欧洲 (ASCII) 数字或基本组合字符开头。几乎所有字符都可以在名称中使用,除了那些可以用作或可以合理用作分隔符的字符。

Name和的确切定义NameStartChar这里

像往常一样,从W3School中可以找到更人性化的解释:

XML 元素必须遵循以下命名规则:

名称可以包含字母、数字和其他字符

名称不能以数字或标点符号开头

名称不能以字母 xml(或 XML,或 Xml 等)开头

名称不能包含空格

可以使用任何名称,不保留任何字词。

概括:

始终以字母开头元素名称 - 使用COL1代替1COL

于 2013-10-30T06:30:48.463 回答
1

实际上,我不需要知道 Oracle 版本(但一般来说,在提问时总是提供它是一种很好的做法)。

错误 LPX-00231 似乎是不言自明的。您不能以数字开头的名称。如果您将代码更改为:

SET serveroutput ON
alter session set cursor_sharing = exact;
with xmldata(d) as (select xmltype('<ROWSET><ROW><A1>ABC</A1></ROW></ROWSET>') from dual
)
select x.*
FROM xmldata,
     xmltable('ROWSET/ROW' passing xmldata.d
              columns
              name varchar2(10) path '1'
     ) x
;

然后它工作正常。

希望有帮助....

于 2013-10-30T04:08:03.363 回答