想从XML获取电子邮件信息,但是收到错误

时间:2016-07-15 09:42:53

标签: sql sql-server xml xml-namespaces

CREATE TABLE XMLTABLE(id int IDENTITY PRIMARY KEY,XML_DATA XML,DATE DATETIME);
go
INSERT INTO XMLTABLE(XML_DATA,DATE)
SELECT CONVERT(XML,BULKCOLUMN)AS DATA,getdate()
FROM OPENROWSET(BULK 'c:\Demo.xml',SINGLE_BLOB)AS x
go
DECLARE @XML AS XML
DECLARE @OUPT AS INT
DECLARE @SQL NVARCHAR (MAX)
SELECT @XML= XML_DATA FROM XMLTABLE
EXEC sp_xml_preparedocument @OUPT OUTPUT,@XML,'<root xmlns:d="http://abc" xmlns:ns2="http://def" />'
SELECT EMAILR
FROM OPENXML(@OUPT,'d:ns2:FORM/ns2:Form1/ns2:Part/ns2:Part1/ns2:Ba')
WITH
(EMAILR [VARCHAR](100) 'ns2:EmailAddress')

EXEC sp_xml_removedocument @OUPT
go

即Demo.xml包含&gt;&gt;

<ns2:FORM xmlns="http://abc" xmlns:ns2="http://def">
 <ns2:Form1>
   <ns2:Part>
 <ns2:Part1>
 <ns2:Ba>
    <ns2:EmailA>Hello@YAHOO.COM</ns2:EmailA> ...
  

错误:消息6603,级别16,状态2,行6 XML解析错误:预期   令牌&#39; eof&#39;发现&#39;:&#39;。

     

d:NS2 - &GT;:其中 - FORM / NS2:Form1中/ NS2:部分/ NS2:第一部分/ NS2:巴

1 个答案:

答案 0 :(得分:2)

使用sp_xml_...方法和FROM OPENXML的方法已过时!

您最好使用当前的XML方法.nodes().value()query().modify()

您的XML示例不完整,两者都无效,必须稍微更改才能使其正常工作。您可能需要调整XPath(至少Part1丢失)。

DECLARE @xml XML=
'<ns2:FORM xmlns="http://abc" xmlns:ns2="http://def">
  <ns2:Form1>
    <ns2:Part>
      <ns2:Ba>
        <ns2:EmailA>Hello@YAHOO.COM</ns2:EmailA>
      </ns2:Ba>
    </ns2:Part>
  </ns2:Form1>
</ns2:FORM> ';

这是名称空间和完整路径的安全方式

WITH XMLNAMESPACES(DEFAULT 'http://abc'
                  ,'http://def' AS ns2)
SELECT @xml.value('(/ns2:FORM/ns2:Form1/ns2:Part/ns2:Ba/ns2:EmailA)[1]','nvarchar(max)');

这是懒惰的方法

SELECT @xml.value('(//*:EmailA)[1]','nvarchar(max)')

您应该 - 但是 - 更喜欢完整方法。你给的越多,你得到的越快越好......