【问题标题】:Selecting all info from nodes with the same name从具有相同名称的节点中选择所有信息
【发布时间】:2015-05-03 20:57:50
【问题描述】:

在 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>

我目前正在使用这种 sn-p 从 TextResult 区域中提取信息

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

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

我对此有两个问题: 1. 不一定只有 2 个具有相同名称的节点 - 它可以无限持续。 2. 我希望所有信息都集中在一个列中。

任何帮助将不胜感激!

【问题讨论】:

  • 您是说要遍历它并获取所有textResult 项目吗?还是具有特定值的节点?
  • 你有一个 Screening[] 数组。所以 DocumentElement 是数据库。筛选是数据库中的一个表。 Sreening 下的标签是表中的字段(列),例如 ScreeningID、ScreeningDate、ScreeningResult、...。要获取数组,您需要查询 /DocumentElement/Screening 以获取 NodeList。
  • 1:你能发布你的完整代码吗? 2:您使用的是什么 RDBMS?对于 XQuery,它们都有不同的限制和语法
  • 我想捕获所有区域的所有文本结果。所以在这种情况下,它将捕获 0 & 1
  • 也在代码中添加了sn-p——我只是想捕获testResults

标签: sql sql-server xml nodes


【解决方案1】:

你可以试试这个方法:

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

SQL Fiddle

【讨论】:

    【解决方案2】:

    我理解你的意思是:在你的 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();

    希望对你有帮助

    【讨论】:

    • 注意问题有标签SQL,没有C#标签
    • @har07 但我认为上面的问题与SQL无关,因为作者没有谈论SQL。
    • 他发布的示例代码是用于查询 XML 列 Select answer.value(....) From Answers 的有效 SQL 服务器语法。参考:msdn.microsoft.com/en-us/library/ms178030.aspx