从具有相同名称的节点中选择所有信息

时间:2015-05-03 20:57:50

标签: sql sql-server xml nodes

对于xml的东西,我是个新手。

到目前为止,我有一段我要从中提取信息的xml,但是所有的节点名都是相同的(所以它只抓取其中一个,除非另有说明)。

它看起来像这样:

<DocumentElement>
  <Screening>
  <ScreeningID>2</ScreeningID>
  <ScreeningDate>2011-09-13T00:00:00-04:00</ScreeningDate>
  <ScreeningResult>1</ScreeningResult>
  <ScreeningResultText>Negative</ScreeningResultText>
  <TextResult>0</TextResult>
  <TextResultText>Not Tested</TextResultText>
  <PageNumber>0</PageNumber>
  <AddedDate>2015-05-03T16:06:41.71774-04:00</AddedDate>
  <UpdateDate>2015-05-03T16:06:41.71774-04:00</UpdateDate>
</Screening>
<Screening>
  <ScreeningID>3</ScreeningID>
  <ScreeningDate>2011-09-13T00:00:00-04:00</ScreeningDate>
  <ScreeningResult>1</ScreeningResult>
  <ScreeningResultText>Negative</ScreeningResultText>
  <TextResult>1</TextResult>
  <TextResultText>Negative</TextResultText>
  <PageNumber>9</PageNumber>
  <AddedDate>2015-05-03T16:25:21.2904988-04:00</AddedDate>
  <UpdateDate>2015-05-03T16:25:21.2904988-04:00</UpdateDate>
</Screening>

我目前正在使用这种代码段从TextResult区域中提取信息

Select 
answer.value('(/DocumentElement/Screening/TextResult)[1]','int')
From 
Answers

但是,这只能获取第一部分信息,我知道如果我写这样的内容,它会让我获得第二部分信息,但在另一列:answer.value('(/DocumentElement/Screening[2]/textResult)[1]','int')

我有两个问题:1。不一定只有2个具有相同名称的节点 - 它可以无限地继续下去。 2.我希望所有信息只收集到一列。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您可以尝试这种方式:

SELECT 
    X.value('.','int') as 'TextResult'
FROM Answers as 'a'
     CROSS APPLY a.answer.nodes('/DocumentElement/Screening/TextResult') as answers(X)

<强> SQL Fiddle

答案 1 :(得分:0)

我理解你的意思是:在xml文档中获取所有TextResult。如果是这样,你可以试试这个:

&#13;
&#13;
string xml = @"<DocumentElement>
                              <Screening>
                              <ScreeningID>2</ScreeningID>
                              <ScreeningDate>2011-09-13T00:00:00-04:00</ScreeningDate>
                              <ScreeningResult>1</ScreeningResult>
                              <ScreeningResultText>Negative</ScreeningResultText>
                              <TextResult>0</TextResult>
                              <TextResultText>Not Tested</TextResultText>
                              <PageNumber>0</PageNumber>
                              <AddedDate>2015-05-03T16:06:41.71774-04:00</AddedDate>
                              <UpdateDate>2015-05-03T16:06:41.71774-04:00</UpdateDate>
                            </Screening>
                            <Screening>
                              <ScreeningID>3</ScreeningID>
                              <ScreeningDate>2011-09-13T00:00:00-04:00</ScreeningDate>
                              <ScreeningResult>1</ScreeningResult>
                              <ScreeningResultText>Negative</ScreeningResultText>
                              <TextResult>1</TextResult>
                              <TextResultText>Negative</TextResultText>
                              <PageNumber>9</PageNumber>
                              <AddedDate>2015-05-03T16:25:21.2904988-04:00</AddedDate>
                              <UpdateDate>2015-05-03T16:25:21.2904988-04:00</UpdateDate>
                            </Screening>
                        </DocumentElement>";
            XElement xmlTree = XElement.Parse(xml);
            IEnumerable<XElement> textResultList = from c in xmlTree.Descendants("TextResult")
                                          select c;
            foreach (var item in textResultList)
            {
                Console.WriteLine(item.Value);
            }

            Console.Read();
&#13;
&#13;
&#13;

我希望这个帮助