1

SQLテーブルにアップロードする必要のあるサンプルxmlファイルがあります。

xmlファイルの下には、テーブルに挿入するXML値を選択するためのSQLクエリがあります。

問題:<Actual>,<ExpectedValue>値が複数回発生するため、値を取得できません

誰かが親切に正しい値を取得するために私を修正/指示するのを手伝ってくれたら幸いです

ありがとう。

<?xml version="1.0" encoding="utf-8" ?>
<Results>
    <General>
        <Version>1.01</Version>
        <InputFilename>TestFile.xml</InputFilename>
        <Filename>xyz.XML</Filename>
        </General>
    <Tests>
        <Test Name="Test 1">
            <Number>0</Number>
            <MinimumSampleCount>1</MinimumSampleCount>
            <ExpectedValues>
            <ExpectedValue>8</ExpectedValue>
            <ExpectedValue>5</ExpectedValue>
            </ExpectedValues>
            <Actual>
                <seq>1</seq>
                <ValueFound>8</ValueFound>
                <seqTestResult>Passed</seqTestResult>
            </Actual>
            <Actual>
                <seq>3</seq>
                <ValueFound>8</ValueFound>
                <seqTestResult>Passed</seqTestResult>
            </Actual>
            <Result>Last sequence matches test cases.</Result>
            <TestResult>Passed</TestResult>
            </Test>
        <Test Name="Test 3">
            <Number>25</Number>
            <ExpectedValues><ExpectedValue>3.50</ExpectedValue>
            <ExpectedValue>3.56</ExpectedValue>
            <ExpectedValue>3.60</ExpectedValue>
            </ExpectedValues>
            <Result>not applicable</Result>
            <TestResult>Skipped</TestResult>
        </Test>
        <OverallTestResult>Passed</OverallTestResult>
    </Tests>
</Results>

SQLコード:

INSERT INTO dbo.Results_XML ([Version],[InputFilename],[Filename],
      [OverallTestResult],Name,Number,MinimumSampleCount,ActualNumberOfSamples,ExpectedValue,
       ActualSeq, ActualValueFound,ActualseqTestResult,CompareValue,Result,TestResult

    SELECT [Version] = x.data.value('Version[1]','numeric(3,2)'),
       [InputFilename] = x.data.value('InputFilename[1]','varchar(80)'),
       [Filename] = x.data.value('Filename[1]','varchar(80)'),
       [OverallTestResult]=T2.N.value('OverallTestResult[1]','varchar(15)'),
       [Test Name]= y.data.value('@Name','varchar(255)')
         ,[Number]= y.data.value('Number[1]','int'),
         [MinimumSampleCount]=y.data.value('Number[1]','int'),
         [ActualNumberOfSamples]=y.data.value('ActualNumberOfSamples[1]','int')
         ,[ExpectedValue]=z.data.value('ExpectedValue[1]','varchar(255)')
         ,[ActualSeq]=v.data.value('Seq[1]','int'),
         ,ActualValueFound=v.data.value('ValueFound[1]','int'),
         ,ActualseqTestResult=v.data.value('seqTestResult[1]','varchar(255)'),
        ,[CompareValue]=y.data.value('CompareValue[1]','bigint')
         ,[Result]=y.data.value('Result[1]','varchar(40)'),
         [TestResult]=y.data.value('TestResult[1]','varchar(10)')

    FROM CD t
       CROSS APPLY t.XMLData.nodes('/Results/General') x(data)
       cross apply t.XMLData.nodes('/Results/Tests') as T2(N)
       CROSS APPLY t.XMLData.nodes('/Results/Tests/Test') as y(data) 
       CROSS APPLY t.XMLData.nodes('Test/ExpectedValues/Expected') z(data) 
       CROSS APPLY t.XMLData.nodes('Test/ExpectedValues/Actual/') v(data)
4

1 に答える 1

0

私は(あなたの前の質問に基づいて)これがSQLServer用であると仮定しています-正しいですか?
使用しているデータベースシステムを常に明示的かつ明確に指定する必要があります-それに慣れてください!

次のようなものを使用する必要があります。

  • <Results>/<General>いくつかの基本データを取得するためのノードのXMLノードを取得します
  • <Test>次に、すべてのノードのリストを取得します-そこからいくつかのデータを取得します
  • 各ノードに基づいて-そのノードとその中のノード<Test>のリストを取得し、必要なデータを選択します<ExpectedValues>/<ExpectedValue><Actual><Test>

私の経験では、説明的な名前を使用することをお勧めします-単に、の代わりにGeneralData、などを使用します-これにより、何を扱っているのかをはるかに理解しやすくなります!ExpectedDataxyz

これが私が使用したT-SQL/XQueryステートメントです。

SELECT 
    -- General values
    [Version] = GeneralData.value('Version[1]','numeric(3,2)'),
    [InputFilename] = GeneralData.value('InputFilename[1]','varchar(80)'),
    [Filename] = GeneralData.value('Filename[1]','varchar(80)'),
    -- Test-specific values
    [Test Name]= TestData.value('@Name','varchar(255)'),
    [Test Number]= TestData.value('Number[1]','int'),
    -- Test-specific expected values
    [ExpectedValue] = ExpectedData.value('.', 'varchar(255)'),
    -- Test-specific actual values
    [ActualSeq] = ActualData.value('(seq)[1]', 'int'),
    ActualValueFound = ActualData.value('(ValueFound)[1]', 'int'),
    ActualseqTestResult = ActualData.value('(seqTestResult)[1]', 'varchar(255)')
FROM 
    CD t
CROSS APPLY
    -- fetch the <Results> / <General> node
    XMLdata.nodes('/Results/General') AS XGD(GeneralData)
CROSS APPLY
    -- fetch a list of  <Results> / <Tests> / <Test> nodes
    XMLDATA.nodes('/Results/Tests/Test') AS XTD(TestData)
CROSS APPLY
    -- for each <Test> node - fetch its contained <ExpectedValues>/<ExpectedValue> nodes
    TestData.nodes('ExpectedValues/ExpectedValue') AS XED(ExpectedData)
CROSS APPLY
    -- for each <Test> node - fetch its contained <Actual> nodes
    TestData.nodes('Actual') AS XAD(ActualData)
于 2013-03-20T06:36:39.950 に答える