如何使用Xpath

时间:2017-06-25 21:07:36

标签: sql xml xpath

我试图找出一种方法,使用xpath(一种展平xml的方法)遍历xml中的多级别多对一关系。请查看以下示例了解详情:

<?xml version="1.0" encoding="UTF-8"?>
  <Sale>
    <CustomerDetail>
      <CustomerCode><![[E]]></CustomerCode>
      <CustRep>
        <phoneNumber><![[000 000 0000]]></phoneNumber>
      </CustRep>
      <CustRep>
        <phoneNumber><![[000 000 0000]]></phoneNumber>
      </CustRep>
    </CustomerDetail>
    <CustomerDetail>
      <CustomerCode><![[X]]></CustomerCode>
      <CustRep>
        <phoneNumber><![[000 000 0000]]></phoneNumber>
      </CustRep>
      <CustRep>
        <phoneNumber><![[000 000 0000]]></phoneNumber>
      </CustRep>
      <CustRep>
        <phoneNumber><![[000 000 0000]]></phoneNumber>
      </CustRep>
    </CustomerDetail>
  </Sale>

如销售示例中所示,可以有许多CustomerDetails,而CustomerDetail可以有许多CustRep。如何使用xpath将此xml结构展平为表?在这方面的任何帮助都非常感谢?

所需的输出如下所示:

CustomerCode    Phone Number
E   000 000 0000
E   000 000 0000
X   000 000 0000
X   000 000 0000
X   000 000 0000

1 个答案:

答案 0 :(得分:1)

使用预期输出进行编辑的Thx,但您没有说明您的RDBMS。阅读XML是特定于供应商的!以下是SQL-Server语法:

备注

  • 您的 XML无效MyLogTable log; Connection con = new UserConnection(); con.ttsBegin(); log.setConnection(con); ... // Set your fields log.insert(); con.ttsCommit(); 部分不正确。最好是使用正确的转义并删除CDATA部分。
  • 我在您的电话号码中添加了一个正在运行的号码,以便更清楚地查看其输出

试试这个:

CDATA

结果

DECLARE @xml XML=
'<?xml version="1.0" encoding="UTF-8"?>
  <Sale>
    <CustomerDetail>
      <CustomerCode><![CDATA[E]]></CustomerCode>
      <CustRep>
        <phoneNumber><![CDATA[000 000 0001]]></phoneNumber>
      </CustRep>
      <CustRep>
        <phoneNumber><![CDATA[000 000 0002]]></phoneNumber>
      </CustRep>
    </CustomerDetail>
    <CustomerDetail>
      <CustomerCode><![CDATA[X]]></CustomerCode>
      <CustRep>
        <phoneNumber><![CDATA[000 000 0003]]></phoneNumber>
      </CustRep>
      <CustRep>
        <phoneNumber><![CDATA[000 000 0004]]></phoneNumber>
      </CustRep>
      <CustRep>
        <phoneNumber><![CDATA[000 000 0005]]></phoneNumber>
      </CustRep>
    </CustomerDetail>
  </Sale>';

  SELECT cd.value('(CustomerCode/text())[1]','nvarchar(max)') AS CustomerCode
        ,cr.value('(phoneNumber/text())[1]','nvarchar(max)') AS phoneNumber
  FROM @xml.nodes('/Sale/CustomerDetail') AS A(cd)
  CROSS APPLY cd.nodes('CustRep') AS B(cr);
相关问题