【问题标题】:Matching and return specific XML nodes匹配并返回特定的 XML 节点
【发布时间】:2014-09-12 14:03:50
【问题描述】:

我需要返回其 ID 属性在 <Settings></Settings><Profile></Profile> 之间匹配并且其 <Setting/> 节点的 Value 属性为 true 的所有 XML 节点。 下面是我的 XML 结构示例:

<HBDI> <Settings> <Setting ID="PreferenceCode" Visible="true"/> <Setting ID="SequenceCode" Visible="true"/> <Setting ID="QuadrantScores" Visible="false"/> <Setting ID="AdjectivePairs" Visible="false"/> <Setting ID="ModeScores" Visible="true"/> <Setting ID="Graph" Visible="true"/> </Settings> <Profile> <PreferenceCode ID="PreferenceCode">3332</PreferenceCode> <SequenceCode ID="SequenceCode">DCAB</SequenceCode> <Graph ID="Graph">Graph.jpg</Graph> <QuadrantScores ID="QuadrantScores"> <QuadrantScore Name="A" Value="3" /> <QuadrantScore Name="B" Value="3" /> <QuadrantScore Name="C" Value="23" /> <QuadrantScore Name="D" Value="46" /> </QuadrantScores> <AdjectivePairs ID="AdjectivePairs"> <AdjectivePair Name="A" Value="4" /> <AdjectivePair Name="B" Value="7" /> <AdjectivePair Name="C" Value="9" /> <AdjectivePair Name="D" Value="10" /> </AdjectivePairs> <ModeScores ID="ModeScores"> <ModeScore Name="Lt" Value="34" /> <ModeScore Name="Rt" Value="54" /> <ModeScore Name="Upr" Value="3" /> <ModeScore Name="Lwr" Value="24" /> </ModeScores> </Profile> </HBDI>

所以我想要实现的是检索以下xml:

<HBDI> <PreferenceCode ID="PreferenceCode">3332</PreferenceCode> <SequenceCode ID="SequenceCode">DCAB</SequenceCode> <Graph ID="Graph">Graph.jpg</Graph> <ModeScores ID="ModeScores"> <ModeScore Name="Lt" Value="34" /> <ModeScore Name="Rt" Value="54" /> <ModeScore Name="Upr" Value="3" /> <ModeScore Name="Lwr" Value="24" /> </ModeScores> </HBDI>

所以,在ID="PreferenceCode"的情况下,&lt;Settings/&gt;中对应的Visible属性为true,因此需要返回。我必须承认,我不知道如何在 ID 之间进行匹配。有什么帮助吗?

【问题讨论】:

    标签: sql-server-2008 xquery flwor


    【解决方案1】:

    在处理 XML 时,请使用 XQuery:

    DECLARE @MyXML xml = '
    <HBDI>
        <Settings>
            <Setting ID="PreferenceCode" Visible="true"/>
            <Setting ID="SequenceCode" Visible="true"/>
            <Setting ID="QuadrantScores" Visible="false"/>
            <Setting ID="AdjectivePairs" Visible="false"/>
            <Setting ID="ModeScores" Visible="true"/>
            <Setting ID="Graph" Visible="true"/>
        </Settings>
        <Profile>
            <PreferenceCode ID="PreferenceCode">3332</PreferenceCode>
            <SequenceCode ID="SequenceCode">DCAB</SequenceCode>
            <Graph ID="Graph">Graph.jpg</Graph>
            <QuadrantScores ID="QuadrantScores">
                <QuadrantScore Name="A" Value="3" />
                <QuadrantScore Name="B" Value="3" />
                <QuadrantScore Name="C" Value="23" />
                <QuadrantScore Name="D" Value="46" />
            </QuadrantScores>
            <AdjectivePairs ID="AdjectivePairs">
                <AdjectivePair Name="A" Value="4" />
                <AdjectivePair Name="B" Value="7" />
                <AdjectivePair Name="C" Value="9" />
                <AdjectivePair Name="D" Value="10" />
            </AdjectivePairs>
            <ModeScores ID="ModeScores">
                <ModeScore Name="Lt" Value="34" />
                <ModeScore Name="Rt" Value="54" />
                <ModeScore Name="Upr" Value="3" />
                <ModeScore Name="Lwr" Value="24" />
            </ModeScores>
        </Profile>
    </HBDI>'
    
    SELECT      @MyXML.query('
    <HDBI> {
        let $settings := /HBDI/Settings
        for $element in /HBDI/Profile/*
            where $settings/Setting[@ID = local-name($element) and @Visible = "true"]
            return $element
    } </HDBI>
    ')
    

    XQuery 循环遍历&lt;Profile&gt; 标记的每个子节点,并检查它是否在&lt;Settings&gt; 节点中设置为@Visible = "true"local-name() 给出当前节点的名称。

    【讨论】:

    • 感谢 Zoff 的回答!
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多