以下代码适用于非整数
我有几个带整数的标签(比如<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.
先谢谢并感谢:)
答案 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)。标签中1
是the name,它给出了元素的类型。名称有一定的naming rules:
[定义:名称是一个以字母或几个标点字符开头的标记,并以字母,数字,连字符,下划线,冒号或句号结尾,一起称为名称字符。]名称以字符串“xml”,或任何匹配的字符串(('X'|'x')('M'|'m')('L'|'l'))保留用于标准化或该规范的未来版本。
和
名称的第一个字符必须是NameStartChar,任何其他字符必须是NameChars;此机制用于防止名称以欧洲(ASCII)数字或基本组合字符开头。几乎所有字符都在名称中被允许,除了那些或者可以合理地用作分隔符的字符。
Name
和NameStartChar
的确切定义为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
;
然后它工作正常。
希望有所帮助....