当前位置: 首页 > 知识库问答 >
问题:

如何从包含XML命名空间的XML列中获取数据(SQL Server 2005)

周正真
2023-03-14

我谷歌了很多,但运气不好。我不能从XML列中检索数据,这些数据来自使用sp_OAGetProperty的Web服务。

XML列包含。。

<ArrayOfCustomerInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
   <Customer CustCode="001">
      <CustName>John</CustName>
      <Queues>
         <Q>
            <No>10</No>
            <Line>1</Line>
         </Q>
      </Queues>
   </Customer> 
</ArrayOfCustomerInfo>

当我执行下面的语句时,我得到了NULL

(但如果我删除所有XML名称空间xmlns:xsi=”就可以了http://www.w3.org/2001/XMLSchema-instance“xmlns:xsd=”http://www.w3.org/2001/XMLSchema“xmlns=”http://tempuri.org/")

SELECT a.b.value('@CustCode','varchar(4)') AS Code
   ,a.b.value('CustName[1]','varchar(20)') AS Name
   ,c.d.value('No[1]','int') AS QNo
   ,c.d.value('(Line)[1]','int') AS QLine
FROM  PGHRMS_Employees x
CROSS APPLY x.data.nodes('/ArrayOfCustomerInfo/Customer') AS a(b)
CROSS APPLY a.b.nodes('Queues/Q') AS c(d)

请给我一些建议。我必须使用SQL SERVER实现以下目标:(

如果有人想复制它,我将脚本粘贴到:http://pastebin.com/ueZGidyL

提前谢谢你!!!

共有1个答案

冀耀
2023-03-14

试试这个:

;WITH XMLNAMESPACES(DEFAULT 'http://tempuri.org/')
SELECT
    Code = XC1.value('@CustCode', 'varchar(4)'),
    Name = XC1.value('CustName[1]', 'varchar(20)'),
    QNo = XC2.value('No[1]', 'int') ,
    QLine = XC2.value('(Line)[1]','int') 
FROM
    PGHRMS_Employees 
CROSS APPLY
    XmlContent.nodes('/ArrayOfCustomerInfo/Customer') AS XT1(XC1)
CROSS APPLY 
    XC1.nodes('Queues/Q') AS XT2(XC2)

使用With XMLNAMESPACES构造,您可以定义以下T-SQL语句使用的一些XML名称空间-默认名称空间或前缀名称空间。

 类似资料:
  • 我有这个XML文件,我需要知道名称空间的URI。 我使用Java(jdk16)和这段代码来获取它们: 但是运行这段代码会给我带来以下结果: 属性的名称是正确的,但是NamespaceURI和前缀不是我要寻找的值。 我到底做错了什么? 提前感谢您的回答。

  • 主要内容:命名冲突,使用前缀来避免命名冲突,XML 命名空间 - xmlns 属性,统一资源标识符(URI,全称 Uniform Resource Identifier),默认的命名空间,实际使用中的命名空间XML 命名空间提供避免元素命名冲突的方法。 命名冲突 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。 这个 XML 携带 HTML 表格的信息: <table> <tr> <td>Apples</td> <td>Bananas</td> <

  • 我在Azure-Databricks中使用spark-xml库。但是我不能得到正确的选项来读取这种包含多个名称空间的文件。 因此,我正在寻找一些帮助,让这在选项编码,或任何其他方法。 这是一个剥离的样品。

  • 我的代码生成的名称空间有问题。我想要的是以下XML: 我得到的是以下XML: 主要区别是: 目前我正在做的是替换1中序列化字符串中的值 这是我正在使用的代码,我如何更改GetNameSpace()来做我在第1点中需要的事情

  • 问题内容: 我知道此页面中有很多此主题,但可悲的是,我仍然无法解决我的问题。 这是我的xml代码: 这是我在Java中的代码: 是的,像往常一样,我无法获得输出,因为它仅显示: 仅当我删除ns:1时,才会显示输出,xml的代码将如下所示: 问题是,我在网上发现的所有建议似乎都没有用: 例如,我已经尝试过 等2 .. 我能得到的唯一最好的输出是,它将显示: 谁能给我正确的代码给我解决我的问题? 提前

  • XPath如何处理XML命名空间? 如果我使用 为了解析下面的XML文档,我得到了0个节点。 但是,我没有在XPath中指定名称空间(即不是路径的每个标记的前缀)。如果我没有明确告诉XPath,它怎么知道我想要哪个?我认为在这种情况下(因为只有一个名称空间),XPath可以完全忽略。但如果有多个名称空间,事情可能会变得糟糕。