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>

ここ<1>で、 は開始タグ(および</1>終了タグ) です。In tags1は、要素の型を与える名前です。名前には特定の命名規則があります。

[定義: 名前は、文字または数個の句読点の 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 に答える