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

Selecting all info from nodes with the same name

在 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. 我希望所有信息都集中在一栏中。

如有任何帮助,我们将不胜感激!

你可以这样试试:

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

SQL Fiddle

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

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();

希望对您有所帮助