代码之家  ›  专栏  ›  技术社区  ›  ajmalmhd04

Oracle XML分析失败,在Name或Nmtoken中发现无效字符

  •  0
  • ajmalmhd04  · 技术社区  · 11 年前

    以下代码适用于非整数。
    我有几个带整数的标签(比如 <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 回复  |  直到 11 年前
        1
  •  3
  •   user272735    11 年前

    错误:

    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等)开头

    名称不能包含空格

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

    摘要:

    元素名称总是以字母开头-use COL1 相反 1COL .

        2
  •  1
  •   Mark J. Bobak    11 年前

    事实上,我不需要知道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
    ;
    

    然后它就可以正常工作了。

    希望能有所帮助。。。。