【问题标题】:EXTRACT RESULTS FROM XML node with namespace using SQL使用 SQL 从具有命名空间的 XML 节点中提取结果
【发布时间】:2015-06-15 12:00:31
【问题描述】:

我有以下 XML 并想提取以下节点的值 1. 结果 2. 证件号 3.costElementCode

<commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <result xmlns="http://response.cim.its.test.edu.au/">SUCCESS</result>
  <value xmlns="http://finance.response.cim.its.test.edu.au/">
    <documentNumber xmlns="http://finance.cim.its.test.edu.au/">12345</documentNumber>
      <lineNumber>2</lineNumber>
      <costElementCode>costElementCode</costElementCode>
      <internalOrderNumber>1000002</internalOrderNumber>
      <costCentreCode>9999</costCentreCode>
      <wbsCode>3000</wbsCode>
      <lineDescription>2 packets of pencils</lineDescription>
      <accountNumber>100000</accountNumber>
      <itemAmount>105.5</itemAmount>
      <fundsDueDate>2015-06-15</fundsDueDate>
    </commitmentLine>
    <commitmentLine xmlns="http://finance.cim.its.test.edu.au/">
      <lineNumber>2</lineNumber>
      <costElementCode>costElementCode</costElementCode>
      <internalOrderNumber>1000002</internalOrderNumber>
      <costCentreCode>9999</costCentreCode>
      <wbsCode>3000</wbsCode>
      <lineDescription>2 packets of pencils</lineDescription>
      <accountNumber>100000</accountNumber>
      <itemAmount>105.5</itemAmount>
      <fundsDueDate>2015-06-15</fundsDueDate>
    </commitmentLine>
  </value>
  </commitmentsResponse>

【问题讨论】:

  • 您是否使用任何特定的编程语言或 DOM 实现?
  • 是的,我希望使用 SQL
  • 任何特定的 SQL 实现?
  • 请添加相关标签,并在问题中指定一些细节以及到目前为止您已完成的工作。
  • 我已经使用 DECLARE @RESULTSET XML = 'w3.org/2001/XMLSchema" xmlns:xsi="w3.org/2001/XMLSchema-instance"> response.cim.its.rmit.edu.au/">SUCCESS</result> finance.response.cim.its.rmit.edu.au"> 12345' ;WITH XMLNAMESPACES('w3.org/2001/XMLSchema' AS s, 'finance.response.cim.its.rmit.edu.au' AS a) SELECT @RESULTSET.value( '(/s:commitmentsResponse/a:value/documentNumber)[1]', 'varchar(max)')

标签: sql xml namespaces xquery


【解决方案1】:

不使用命名空间:

DECLARE @myXML xml =  
N'<commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <result>SUCCESS</result>
  <value>
    <documentNumber>12345</documentNumber>
    <commitmentLine>
      <lineNumber>2</lineNumber>
      <costElementCode>costElementCode</costElementCode>
      <internalOrderNumber>1000002</internalOrderNumber>
      <costCentreCode>9999</costCentreCode>
      <wbsCode>3000</wbsCode>
      <lineDescription>2 packets of pencils</lineDescription>
      <accountNumber>100000</accountNumber>
      <itemAmount>105.5</itemAmount>
      <fundsDueDate>2015-06-15</fundsDueDate>
    </commitmentLine>
    <commitmentLine xmlns="http://finance.cim.its.test.edu.au/">
      <lineNumber>2</lineNumber>
      <costElementCode>costElementCode</costElementCode>
      <internalOrderNumber>1000002</internalOrderNumber>
      <costCentreCode>9999</costCentreCode>
      <wbsCode>3000</wbsCode>
      <lineDescription>2 packets of pencils</lineDescription>
      <accountNumber>100000</accountNumber>
      <itemAmount>105.5</itemAmount>
      <fundsDueDate>2015-06-15</fundsDueDate>
    </commitmentLine>
  </value>
  </commitmentsResponse>'

  DECLARE @DocumentNumber INT  
  SELECT @DocumentNumber = [Table].[Column].value('documentNumber[1]', 'INT') 
                                 FROM @myXML.nodes('/commitmentsResponse/value') AS [Table]([Column])

  DECLARE @Result VARCHAR(256) 
  SELECT @Result = [Table].[Column].value('result[1]', 'varchar(256)') 
                                 FROM @myXML.nodes('/commitmentsResponse') AS [Table]([Column])

  DECLARE @CostElementCode VARCHAR(256)
  SELECT @CostElementCode = [Table].[Column].value('costElementCode[1]', 'varchar(256)') 
                                 FROM @myXML.nodes('/commitmentsResponse/value/commitmentLine') AS [Table]([Column])

  SELECT @Result
  SELECT @DocumentNumber
  SELECT @CostElementCode

使用命名空间:

DECLARE @myXML xml =  
N'<commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <result xmlns="http://response.cim.its.test.edu.au/">SUCCESS</result>
  <value>
    <documentNumber xmlns="http://finance.cim.its.test.edu.au/">12345</documentNumber>
    <commitmentLine>
      <lineNumber>2</lineNumber>
      <costElementCode>costElementCode</costElementCode>
      <internalOrderNumber>1000002</internalOrderNumber>
      <costCentreCode>9999</costCentreCode>
      <wbsCode>3000</wbsCode>
      <lineDescription>2 packets of pencils</lineDescription>
      <accountNumber>100000</accountNumber>
      <itemAmount>105.5</itemAmount>
      <fundsDueDate>2015-06-15</fundsDueDate>
    </commitmentLine>
    <commitmentLine xmlns="http://finance.cim.its.test.edu.au/">
      <lineNumber>2</lineNumber>
      <costElementCode>costElementCode</costElementCode>
      <internalOrderNumber>1000002</internalOrderNumber>
      <costCentreCode>9999</costCentreCode>
      <wbsCode>3000</wbsCode>
      <lineDescription>2 packets of pencils</lineDescription>
      <accountNumber>100000</accountNumber>
      <itemAmount>105.5</itemAmount>
      <fundsDueDate>2015-06-15</fundsDueDate>
    </commitmentLine>
  </value>
  </commitmentsResponse>'

  DECLARE @DocumentNumber INT  
;WITH XMLNAMESPACES (N'http://finance.cim.its.test.edu.au/' as DYN)
 SELECT @DocumentNumber = c.value('(DYN:documentNumber)[1]', 'INT')
 FROM    @myXML.nodes('/commitmentsResponse/value') t(c)


 DECLARE @Result VARCHAR(256) 
;WITH XMLNAMESPACES (N'http://response.cim.its.test.edu.au/' as DYN)
 SELECT @Result = c.value('(DYN:result)[1]', 'VARCHAR(256)')
 FROM    @myXML.nodes('/commitmentsResponse') t(c)


  DECLARE @CostElementCode VARCHAR(256)
  SELECT @CostElementCode = c.value('(costElementCode)[1]', 'VARCHAR(256)')
  FROM    @myXML.nodes('/commitmentsResponse/value/commitmentLine') t(c)


  SELECT @Result
  SELECT @DocumentNumber
  SELECT @CostElementCode

【讨论】:

  • Dev D : 非常感谢 mate 它运行良好...非常感谢..我可以看到您已将命名空间从节点中移开有没有一种方法可以让我们拥有命名空间并仍然获得结果
  • 是的,伙计..我有一个解决方案。请在下面查看我的另一个答案。如果对您有用,请将其标记为答案。
  • 请结合两个答案。并在组合答案中提出 2 个解决方案。
  • @Mohitsikri - 上面的答案对你有用吗?如果有效,请将其标记为答案,它也会对其他人有所帮助。
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多