【问题标题】:ORA-19202: Error occurred in XML processing LPX-00210: expected '<' instead of 'M' Error at line 1ORA-19202: 处理 XML 时出错 LPX-00210: 预期为 '<' 而不是 'M' 第 1 行错误
【发布时间】:2016-02-06 07:06:03
【问题描述】:

这个查询多年来一直正常工作,直到最近我在收集器中更改了另一个查询并保存了。我根本没有改变这个 xml 查询,但现在它在 xml 部分失败了。我绝对不精通 xml,所以我正在寻找一些帮助来查看问题所在。这是我收到的错误消息:

ORA-31011: XML 解析失败 ORA-19202: XML 发生错误 处理 LPX-00210:预期 '

这是我的查询正常工作,但现在不是:

select Distinct trim(B.RoleID) as RoleID,
             replace(replace(extractvalue(value(C), '/item/menu') || ' >' ||
             extractvalue(value(C), '/item/submenu1') || ' >' ||
             extractvalue(value(C), '/item/submenu2') || ' >' ||
             extractvalue(value(C), '/item/label'), ' > > >', ' >'),' > >', ' >') as Res,
             extractvalue(value(C), '/item/name') as Action,
             extractvalue(value(C), '/item/visible') as visible
             from PLPROD_MORT.MENU A, 
             (SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Processing and Closing (Group A)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Branch Consumer (Group B)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Branch Level Input (Group C)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('DU (Group D)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Escrow Accounting (Group E)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Override Locking - PE (Group F)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Post Closing (Group G)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Servicing - Reconciliation - Loan Support (Group H)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Point of Sale Consumer (Group I)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Training (Group J)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Secondary Marketing (Group M)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Originator (Group O)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Appraisal (Group P)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Quality Control (Group Q)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Rate Lock (Group R)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Servicing (Group S)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Lock - PE (Group T)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Underwriting (Group U)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Test X Level (Group X)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Management Override (Group Y)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Test (Group Z)') AS RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('All screens and stages (No Groups)') As RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Inquiry Only (Access I)') As RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Operator (Access O)') As RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Preferred Operator (Access P)') As RoleID FROM PLPROD_MORT.MENU
             union  
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('Supervisor (Access S)') As RoleID FROM PLPROD_MORT.MENU
             union
             SELECT DISTINCT TRIM("MENUNAME") AS Menu, TRIM("MENUNAME") || ' - ' || upper('No Access') As RoleID FROM PLPROD_MORT.MENU) B,
             table
             (XMLSEQUENCE
             (extract
             (XMLTRANSFORM
             (XMLTYPE(A.MENUDATA),
              XMLTYPE('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" version="1.0" omit-xml-declaration="yes"/><xsl:template match="/"><menus><xsl:for-each select="//menu"><item><name>Menu</name><menu><xsl:value-of select="@label"/></menu><submenu1/><submenu2/><label/><mnemonic><xsl:value-of select="@mnemonic"/></mnemonic><visible><xsl:value-of select="@visible"/></visible></item></xsl:for-each><xsl:for-each select="//menu/item"><item><name>Menu Item</name><menu><xsl:value-of select="../@label"/></menu><submenu1/><submenu2/><label><xsl:value-of select="@label"/></label><mnemonic><xsl:value-of select="@mnemonic"/></mnemonic><visible><xsl:value-of select="@visible"/></visible></item></xsl:for-each><xsl:for-each select="//menu/submenu"><item><name>Submenu</name><menu><xsl:value-of select="../@label"/></menu><submenu1><xsl:value-of select="@label"/></submenu1><submenu2/><label/><mnemonic><xsl:value-of select="@mnemonic"/></mnemonic><visible><xsl:value-of select="@visible"/></visible></item></xsl:for-each><xsl:for-each select="//menu/submenu/item"><item><name>Submenu Item</name><menu><xsl:value-of select="../../@label"/></menu><submenu1><xsl:value-of select="../@label"/></submenu1><submenu2/><label><xsl:value-of select="@label"/></label><mnemonic><xsl:value-of select="@mnemonic"/></mnemonic><visible><xsl:value-of select="@visible"/></visible></item></xsl:for-each><xsl:for-each select="//menu/submenu/submenu"><item><name>Submenu</name><menu><xsl:value-of select="../../@label"/></menu><submenu1><xsl:value-of select="../@label"/></submenu1><submenu2><xsl:value-of select="@label"/></submenu2><label/><mnemonic><xsl:value-of select="@mnemonic"/></mnemonic><visible><xsl:value-of select="@visible"/></visible></item></xsl:for-each><xsl:for-each select="//menu/submenu/submenu/item"><item><name>Submenu Item</name><menu><xsl:value-of select="../../../@label"/></menu><submenu1><xsl:value-of select="../../@label"/></submenu1><submenu2><xsl:value-of select="../@label"/></submenu2><label><xsl:value-of select="@label"/></label><mnemonic><xsl:value-of select="@mnemonic"/></mnemonic><visible><xsl:value-of select="@visible"/></visible></item></xsl:for-each></menus></xsl:template></xsl:stylesheet>'))
              , '//item'))) C
              where trim(A.MENUNAME) = B.MENU and extractvalue(value(C), '/item/visible') = 'true'

【问题讨论】:

  • 什么是A.MENUDATA
  • A.MENUDATA 是数据库中包含我要解析的 xml 的列的名称。
  • 菜单名是否包含&lt;&gt;?试试这个来转义字符:UTL_I18N.ESCAPE_REFERENCE(TRIM("MENUNAME"), 'AL32UTF8')
  • 尝试添加,但似乎不起作用。不确定我是否在正确的地点或地点输入它。我得到无效的 ESCAPE_REFERENCE 标识符
  • 但是该列中有什么数据?听起来您的值实际上不是 XML,但我们看不到您的数据。尝试select XMLType(MENUDATA) from PLPROD_MORT.MENU,我想你会看到同样的错误;那么您需要追踪哪一行的价值不高。以及它是如何产生的,但这是一个不同的问题......

标签: xml oracle


【解决方案1】:

您的PLPROD_MORT.MENU 表的MENUDATA 列中有数据,其中包含字符串值(在本例中为CLOB),这是无效的XML。从您得到的错误中,您至少有一个以M 开头的值,但您在 cmets 中的测试表明您有 31 行具有非 XML 值。

我推测该值可能是文字字符串'MENUDATA',因为它会得到相同的错误:

select xmltype('MENUDATA') from dual;

Error starting at line : 1 in command -
select xmltype('MENUDATA') from dual
Error report -
SQL Error: ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00210: expected '<' instead of 'M'
Error at line 1
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
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.

但它只是告诉你它以M 开头。但是,如果它确实具有该文字值,我会进一步推测有人插入或更新了数据并且不小心使用了文字而不是标识符,例如使用以下方法复制现有条目:

insert into PLPROD_MORT.MENU(MENUDATA) 
select 'MENUDATA' from PLPROD_MORT
where ...

代替:

insert into PLPROD_MORT.MENU(MENUDATA) 
select "MENUDATA" from PLPROD_MORT
where ...

但这是几层猜测,导致原始数据问题的原因与您询问的查询无关 - 只是看到了不良数据的症状。

【讨论】:

    【解决方案2】:

    Oracle 抱怨“SYS.XMLTYPE”不是有效的 xml 列或类型。它需要&lt;element&gt;....&lt;/element&gt; 格式

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我可以通过更正 extractvalue() 函数中的 Xpath 来解决这个问题。我为 CLOB 值提取输入了错误的 Xpath。希望这可能有助于解决您的问题。

      【讨论】:

        猜你喜欢
        • 2019-01-13
        • 1970-01-01
        • 2016-07-25
        • 2020-12-15
        • 2016-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多