我试图找出一种方法,使用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
答案 0 :(得分:1)
使用预期输出进行编辑的Thx,但您没有说明您的RDBMS。阅读XML是特定于供应商的!以下是SQL-Server语法:
备注
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);