【问题标题】:Find element or attribute value anywhere in XML在 XML 中的任意位置查找元素或属性值
【发布时间】:2017-07-27 12:56:51
【问题描述】:

我正在尝试查找元素/属性的值,而不管它存在于 XML 中的什么位置。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<cXML payloadID="12345677-12345567" timestamp="2017-07-26T09:11:05">
  <Header>
    <From>
      <Credential domain="1212">
        <Identity>01235          </Identity>
        <SharedSecret/>
      </Credential>
    </From>
    <To>
      <Credential domain="1212">
        <Identity>01234</Identity>
      </Credential>
    </To>
    <Sender>
      <UserAgent/>
      <Credential domain="8989">
        <Identity>10678</Identity>
        <SharedSecret>Testing123</SharedSecret>
      </Credential>
    </Sender>
  </Header>
  <Request deploymentMode="Prod">
    <ConfirmationRequest>
      <ConfirmationHeader noticeDate="2017-07-26T09:11:05" operation="update" type="detail">
        <Total>
          <Money>0.00</Money>
        </Total>
        <Shipping>
          <Description>Delivery</Description>
        </Shipping>

        <Comments>WO# generated</Comments>
      </ConfirmationHeader>
      <OrderReference orderDate="2017-07-25T15:22:11" orderID="123456780000">
        <DocumentReference payloadID="5678-4567"/>
      </OrderReference>
      <ConfirmationItem quantity="1" lineNumber="1">
        <ConfirmationStatus quantity="1" type="detail">
          <ItemIn quantity="1">
            <ItemID>
              <SupplierPartID>R954-89</SupplierPartID>
            </ItemID>
            <ItemDetail>
              <UnitPrice>
                <Money currency="USD">0.00</Money>
              </UnitPrice>
              <Description>Test Descritpion 1</Description>
              <UnitOfMeasure>QT</UnitOfMeasure>
            </ItemDetail>
          </ItemIn>
        </ConfirmationStatus>
      </ConfirmationItem>
      <ConfirmationItem quantity="1" lineNumber="2">
        <ConfirmationStatus quantity="1" type="detail">
          <ItemIn quantity="1">
            <ItemID>
              <SupplierPartID>Y954-89</SupplierPartID>
            </ItemID>
            <ItemDetail>
              <UnitPrice>
                <Money currency="USD">0.00</Money>
              </UnitPrice>
              <Description>Test Descritpion 2</Description>
              <UnitOfMeasure>QT</UnitOfMeasure>
            </ItemDetail>
          </ItemIn>
        </ConfirmationStatus>
      </ConfirmationItem>

    </ConfirmationRequest>
  </Request>
</cXML>

我想在DocumentReference 元素上获取payloadID 的值。这是我迄今为止尝试过的:

BEGIN
     Declare @Xml xml
     Set @Xml = ('..The XML From Above..' as xml)       
END

--no value comes back
Select c.value('(/*/DocumentReference/@payloadID)[0]','nvarchar(max)') from @Xml.nodes('//cXML') x(c)

--no value comes back
Select c.value('@payloadID','nvarchar(max)') from @Xml.nodes('/cXML/*/DocumentReference') x(c)

--check if element exists and it does
Select @Xml.exist('//DocumentReference');

我在 xPath 编辑器中试过这个://DocumentReference/@payloadID 这确实有效,但我不确定 SQL 中的等效语法是什么

【问题讨论】:

  • Select c.value('@payloadID','nvarchar(max)') from @Xml.nodes('//DocumentReference') x(c)?
  • @Siyual,天哪!类似的例子总是有对根元素的引用,所以我认为我需要它。我什至从未尝试过。如果您想将其发布为答案,那就太好了。

标签: sql sql-server xml xpath


【解决方案1】:

调用.nodes()(如评论中建议的那样)是不必要的开销......

最好这样尝试:

SELECT @XML.value('(//DocumentReference/@payloadID)[1]','nvarchar(max)')

请注意,XPath1 开始计数。您的 [0] 示例无法正常工作...

--no value comes back
Select c.value('(/*/DocumentReference/@payloadID)[0]','nvarchar(max)') from...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多