【问题标题】:Parsing the XML Data in columns解析列中的 XML 数据
【发布时间】:2020-08-29 05:08:04
【问题描述】:

在列、语言和值基础上解析以下 XML 时需要帮助。我能够以行为基础解析值。任何人都可以帮忙。查询需要在 SQL Server 中。我曾尝试使用OPENXML 写作。但它没有给我想要的输出。任何帮助将不胜感激。

<Root>
  <dataModel>
    <repo name="SKU" profile="SKU"/>
  </dataModel>
  <SKU repo="SKU">   
    <SKU_SKU_Number>DR90A3000/U</SKU_SKU_Number> 
    <dynamicAttr>
       <attrName>Power Supply Frequency</attrName>
          <attrValue mLang="1">
            <value lang="en">60 Hz</value>
            <value lang="da-DK"/>
          </attrValue>
          <desc code="">60 Hz</desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Ambient Operating Temperature (Max)</attrName>
          <attrValue mLang="1">
            <value lang="en">90°F </value>
            <value lang="da-DK"/>
          </attrValue>
          <attrValue mLang="1">
            <value lang="en"> 32°C</value>
            <value lang="da-DK"/>
          </attrValue>
          <desc code="">90°F | 32°C</desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Compatible Humidifier Pad</attrName>
          <attrValue mLang="1">
            <value lang="en"/>
            <value lang="da-DK"/>
          </attrValue>
          <desc code=""> </desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Building Size (Max)</attrName>
          <attrValue mLang="1">
            <value lang="en">Up to 20,000 cubic feet</value>
            <value lang="da-DK"/>
          </attrValue>
          <desc code="">Up to 20,000 cubic feet</desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Recommended Service Life</attrName>
          <attrValue mLang="1">
            <value lang="en">10 Years</value>
            <value lang="da-DK"> </value>
          </attrValue>
          <desc code="">10 Years</desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Current Draw</attrName>
          <attrValue mLang="1">
            <value lang="en">0.625 A</value>
            <value lang="da-DK"> </value>
          </attrValue>
          <desc code="">0.625 A</desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Operating Voltage</attrName>
          <attrValue mLang="1">
            <value lang="en">24 VAC</value>
            <value lang="da-DK">25 VAC</value>
            <value lang="da-OTH">26 VAC</value>
          </attrValue>
          <desc code="">24 VAC</desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Static Pressure (Max)</attrName>
          <attrValue mLang="1">
            <value lang="en">0.3 in wc</value>
            <value lang="da-DK"> </value>
          </attrValue>
          <desc code="">0.3 in wc</desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Duct Opening Width</attrName>
          <attrValue> </attrValue>
          <desc code=""> </desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Duct Opening Diameter</attrName>
          <attrValue> </attrValue>
          <desc code=""> </desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Housing Material</attrName>
          <attrValue> </attrValue>
          <desc lang="en"> </desc>
          <desc lang="da-DK"> </desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Duct Opening Height</attrName>
          <attrValue> </attrValue>
          <desc code=""> </desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Building Square Footage (Max)</attrName>
          <attrValue mLang="1">
            <value lang="en"> </value>
            <value lang="da-DK"> </value>
          </attrValue>
          <desc code=""> </desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Power Consumption</attrName>
          <attrValue mLang="1">
            <value lang="en"/>
            <value lang="da-DK"/>
          </attrValue>
          <desc code=""> </desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Mounting Type</attrName>
          <attrValue> </attrValue>
          <desc lang="en"> </desc>
          <desc lang="da-DK"> </desc>
        </dynamicAttr>
        <dynamicAttr>
          <attrName>Remote Mounting Distance (Max)</attrName>
          <attrValue> </attrValue>
          <desc code=""> </desc>
        </dynamicAttr>
  </SKU>
</Root>

期望的输出应该是

【问题讨论】:

  • 您的 XML 数据中没有空值。自闭合标签应该包含 xsi:nil="true" 属性,如果它们应该为空,但它们不是,所以大多数这些值要么是空格,要么是空字符串。您可以使用 nullif() 更正这是 SQL,例如:nullif(trim(x.n.value(N'...', N'...')), N'')
  • @AlwaysLearning 我不是 XML 专家。感谢分享信息

标签: sql-server xml sql-server-2012 xml-parsing


【解决方案1】:

假设您的 XML 数据位于 @XmlData SQL 变量中 - 您可以使用此 XQuery 获取您要查找的数据:

SELECT
    SkuNumber = XC.value('(SKU_SKU_Number)[1]', 'varchar(50)'),
    AttrName = XC2.value('(attrName)[1]', 'varchar(50)'),
    Lang = xc3.value('@lang', 'varchar(10)'),
    Value = xc3.value('(.)[1]', 'varchar(50)')
FROM
    @XmlData.nodes('/Root/SKU') AS XT(XC)
CROSS APPLY
    XC.nodes('dynamicAttr') AS XT2(XC2)
CROSS APPLY
    XC2.nodes('attrValue/value') AS XT3(XC3)

输出:

内置的原生 XQuery 支持比旧的、遗留的(部分错误的)OPENXML 方法更受欢迎。

基本上,你需要两个嵌套的“循环”——第一个 .nodes() 调用让你得到 &lt;Root&gt; 下的所有 &lt;SKU&gt; 元素(只是一个)从那个节点获取数据——然后你需要“循环" 遍历&lt;SKU&gt; 内的所有&lt;dynamicAttr&gt; XML 元素以获取一些信息,并且您需要再次遍历包含的&lt;attrValue&gt;/&lt;value&gt; 子节点以获取最后的详细信息。

【讨论】:

  • @GopakumarN.Kurup:如果这个答案帮助你解决了你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2020-06-03
  • 2013-07-08
  • 1970-01-01
相关资源
最近更新 更多