XML解析错误:格式不正确 - 这是由于像

时间:2016-04-19 13:08:10

标签: sql xml oracle parsing oracle11g

我已经构建了一个SQL XML程序,该程序适用于大多数记录,但由于数据的原因,只能记录在几条记录上。

如何克服不需要的字符问题。我正在从Oracle11g数据库上的SQL生成XML文件,但在几条记录中得到以下消息。其中一条记录显示包含“ô9.96+õ.99P& H”的XML标记字段标题,见下面的输出。

   <?xml version="1.0" encoding="UTF-8"?>
  <AV-XML xmlns="http://www.iceservices.com/0.7/AV-XML" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.iceservices.com/0.7/AV-XML AV-XML.xsd">
 <Delivery>
  <supplierType>ADMIN-AGENCY</supplierType>
  <versionId>0.7</versionId>
  <creationDateTime>2016-04-19T13:47:57+0100</creationDateTime>
  <otherInformation>MIGRATION FIRST DELIVERY</otherInformation>
</Delivery>
<Message>
<messageSequenceId>1</messageSequenceId>
<messageType>NEW</messageType>
<otherInformation>MIGRATION FIRST DELIVERY</otherInformation>
<Production>
  <prodCategoryType>COMMERCIAL</prodCategoryType>
  <prodStatusType>SKELETON</prodStatusType>
  <prodActive>true</prodActive>
  <prodCueStatusType>NO</prodCueStatusType>
  <prodTvInhouse>Y</prodTvInhouse>
  <prodTotalDuration>PT3M</prodTotalDuration>
  <priorityValue>1</priorityValue>
  <prodTitle>
    <title>CLASSIC LOVE SONGS OF RN R</title>
    <titleType>ORIGINAL</titleType>
  </prodTitle>
  <prodTitle>
    <title>ô9.96 + õ.99 P&amp;H</title>
    <titleType>CAMPAIGN</titleType>
  </prodTitle>
  <prodId>
    <idType>SOCIETY-ID</idType>
    <id>75125334</id>
  </prodId>
  <prodId>
    <idType>CLOCKID</idType>
    <id>TMECSRL505180</id>
  </prodId>
  <prodAuthorizedIp>
    <LASTNAME>BACC</LASTNAME>
  </prodAuthorizedIp>
 </Production>
 </Message>
 </AV-XML>

当我尝试在firefox或IE中打开它时,我得到以下消息,指示我到错误的行。这是上面的ô9.96+õ.99P&amp; H.

XML Parsing Error: not well-formed
Location: file://///data2/data/Download/d7prdv1/prsrepreports  /test_error_1.xml
Line Number 26, Column 16:        <title>49.96 + �5.99 P&amp;H</title>

如何使用REPLACE Oracle函数替换更可接受的字符来解决这个问题?

2 个答案:

答案 0 :(得分:0)

我相信嵌套的REPLACE语句是你需要的。您只需要知道要替换的字符的ASCII代码。你列出了'ô'和'õ',所以我和那些人一起工作。

http://www.techonthenet.com/oracle/functions/replace.php

create table monkey(
    string1 VARCHAR2(30 CHAR)
);

insert into monkey values ('ô9.96 + õ.99 P&H');

select ASCII('ô') from dual;
--50100

select ASCII('õ') from dual;
--50101

select string1, REPLACE(REPLACE(string1, chr(50101), ''), chr(50100), '') from monkey;

或者,简单地说:

select string1, REPLACE(REPLACE(string1, chr(ASCII('ô')), ''), chr(ASCII('õ')), '') from monkey;

答案 1 :(得分:0)

可以使用&ocirc;&otilde;或使用拟合dec或十六进制代码对两个字符进行转义。这取决于读者......

请看这里:http://www.w3schools.com/charsets/ref_utf_latin1_supplement.asp

此外,您可能会尝试将编码更改为UTF-16。目前您的XML设置为UTF-8,并且两个o-派生不包含在基本字符集中...

我不知道oracle如何处理这个问题,但是在SQL Server中,如果你声明unicode,它会有很大的不同。第一个调用会抛出一个错误(非法字符),第二个调用(看看前导&#34; N&#34;以及UTF-16)会起作用:

DECLARE @xml XML='<?xml version="1.0" encoding="UTF-8"?><root><title>ô9.96 + õ.99 P&amp;H</title></root>'; 
DECLARE @xml1 XML=N'<?xml version="1.0" encoding="UTF-16"?><root><title>ô9.96 + õ.99 P&amp;H</title></root>';