无法解析 XML

Not able to parse XML

提问人:kumar kandula 提问时间:4/5/2022 最后编辑:kumar kandula 更新时间:4/6/2022 访问量:88

问:

我需要帮助将 XML 变量解析为如下表格式。我是解析的新手,在谷歌中查找,能够解析 , ,但无法解析具有 , ,AccountIdEmailProductNameProductTypeCustNameCreatedDatebillingCode

   DECLARE @xmlvalue XML = 
'<Request>
  <AccountId>16000</AccountId>
  <Email>[email protected]</Email>
  <Attributes>
  <Attribute><Name xmlns="http://testtarget.com/wsdl/myAPI">CustName</Name><Value xmlns="http://testtarget.com/wsdl/myAPI">TestName</Value></Attribute>
  <Attribute><Name xmlns="http://testtarget.com/wsdl/myAPI">CreatedDate</Name><Value xmlns="http://testtarget.com/wsdl/myAPI">3/26/2022</Value></Attribute>
  <Attribute><Name xmlns="http://testtarget.com/wsdl/myAPI">BillingCode</Name><Value xmlns="http://testtarget.com/wsdl/myAPI">testbiling</Value></Attribute>
  </Attributes>
  <ProductName>TestProduct</ProductName>
  <ProductType>Recurring</ProductType>
</Request>'

预期输出 :

AccountId  Email           CustName  CreatedDate  BillingCode  ProductName ProductType
1600       [email protected]  TestName   03/26/2022  testbiling  TestProduct  Recurring

下面的代码给了我我想要的东西。有没有简单的方法?

SELECT req.req_col.value('AccountId[1]','INT')       AS AccountId, 
       req.req_col.value('Email[1]','VARCHAR(100)')  AS Email,
       req.req_col.value('ProductName[1]','VARCHAR(100)')    AS ProductName,
       req.req_col.value('ProductType[1]','VARCHAR(100)')    AS ProductType,
       v.CustName,
       v.CreatedDate,
       v.BillingCode
FROM @xmlvalue.nodes('/Request')                                req(req_col)
CROSS APPLY  ( SELECT *
                FROM (SELECT req.req_col.value('Name[1]','VARCHAR(100)')     AS Name,
                           req.req_col.value('Value[1]','VARCHAR(100)')      AS Value
                      FROM @xmlvalue.nodes('/Request/Attributes/Attribute') req(req_col)
                     ) tab1
                PIVOT (
                MAX(Value) FOR Name IN ( CustName, CreatedDate, BillingCode )) Tab2
           ) v
SQL Server XML 分析

评论

0赞 marc_s 4/5/2022
到目前为止,请向我们展示您的代码!
1赞 AlwaysLearning 4/5/2022
欢迎来到 Stack Overflow!虽然我们在这里帮助您解决编程问题和错误,但请注意,我们不是免费的代码编写服务。请编辑您的问题,以包含您到目前为止尝试过的 SQL 代码,并告诉我们您认为它不符合您的要求的原因。

答:

1赞 AlwaysLearning 4/5/2022 #1

没有必要用于此目的,您可以在 XPath 表达式中使用过滤器来选择各种属性名称-值元素对,例如:PIVOT

with xmlnamespaces (
  'http://testtarget.com/wsdl/myAPI' as anything
)
select
  request.value(N'(AccountId/text())[1]', N'nvarchar(50)') as AccountId,
  request.value(N'(Email/text())[1]', N'nvarchar(50)') as Email,
  request.value(N'(Attributes/Attribute[anything:Name/text()="CustName"]/anything:Value/text())[1]', N'nvarchar(50)') as CustName,
  request.value(N'(Attributes/Attribute[anything:Name/text()="CreatedDate"]/anything:Value/text())[1]', N'nvarchar(50)') as CreatedDate,
  request.value(N'(Attributes/Attribute[anything:Name/text()="BillingCode"]/anything:Value/text())[1]', N'nvarchar(50)') as BillingCode,
  request.value(N'(ProductName/text())[1]', N'nvarchar(50)') as ProductName,
  request.value(N'(ProductType/text())[1]', N'nvarchar(50)') as ProductType
from @xmlvalue.nodes('/Request') foo(request);
帐户 ID 电子邮件 客户名称 创建日期 BillingCode(计费代码) 产品名称 产品类型
16000 [电子邮件保护] 测试名称 3/26/2022 测试 测试产品 经常性

评论

0赞 kumar kandula 4/6/2022
谢谢你的回复。实际代码中包含 xml 命名空间。当它们存在时,您的答案可以调整吗?我去更新了xmldata,只是为了供你参考——普拉迪普·坎杜拉
0赞 AlwaysLearning 4/6/2022
使用命名空间引用进行了更新。注意:使用时,请确保上一条语句以分号字符正确终止。作为标准做法,应以分号结束每个 T-SQL 语句。with xmlnamespaces;;
0赞 kumar kandula 4/6/2022
AlwaysLearning 在合并到真实代码后就像魅力一样工作。感谢您的及时输入和解释。