Oracle XML解析失败,在Name或Nmtoken中找到无效字符

时间:2013-10-30 03:54:43

标签: sql xml oracle plsql oracle11g

以下代码适用于非整数 我有几个带整数的标签(比如<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.

先谢谢并感谢:)

2 个答案:

答案 0 :(得分:3)

错误:

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

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

<1>ABC</1>

其中<1>start tag(而</1>end tag)。标签中1the name,它给出了元素的类型。名称有一定的naming rules

  

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

  

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

NameNameStartChar的确切定义为here

像往常一样,W3School发现了一个更人性化的解释:

  

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

     

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

     

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

     

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

开头      

名称不能包含空格

     

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

<强>要点:

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

答案 1 :(得分: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
;

然后它工作正常。

希望有所帮助....