我已经构建了一个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&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&H</title>
如何使用REPLACE Oracle函数替换更可接受的字符来解决这个问题?
答案 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)
可以使用ô
和õ
或使用拟合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&H</title></root>';
DECLARE @xml1 XML=N'<?xml version="1.0" encoding="UTF-16"?><root><title>ô9.96 + õ.99 P&H</title></root>';