【问题标题】:How to extract every occurence of tags in an XML file如何提取 XML 文件中每次出现的标记
【发布时间】:2014-06-17 15:53:16
【问题描述】:

我有以下 XML 文件:

<queryResponse xmlns="">
    <querySubjectResponse xmlns="">
        ...
        <report>
            <informationReported>
                <aar>
                    <narrative>THIS IS A TEST NARRATIVE</narrative>
                </aar>
            </informationReported>
            ...
            <statement>
                <subjectStatement>
                    <statement>THIS IS A TEST STATEMENT</statement>
                </subjectStatement>
            </statement>
            ...
        </report>
        ...
        <report>
            <informationReported>
                <aar>
                    <narrative>THIS IS A TEST NARRATIVE2</narrative>
                </aar>
            </informationReported>
            ...
            <statement>
                <subjectStatement>
                    <statement>THIS IS A TEST STATEMENT2</statement>
                </subjectStatement>
            </statement>
            ...
        </report>
        ...
        <report>
            <informationReported>
                <aar>
                    <narrative>THIS IS A TEST NARRATIVE3</narrative>
                </aar>
            </informationReported>
            ...
            <statement>
                <subjectStatement>
                    <statement>THIS IS A TEST STATEMENT3</statement>
                </subjectStatement>
            </statement>
            ...
        </report>
        ...
    </querySubjectResponse>
</queryResponse>

我正在研究 LINQ to XML,但不确定如何实现它。我想保存叙述,对于每个叙述,将语句保存到一个数组中以供以后使用。

例子:

THIS IS A TEST NARRATIVE
THIS IS A TEST STATEMENT

THIS IS A TEST NARRATIVE2
THIS IS A TEST STATEMENT2

THIS IS A TEST NARRATIVE3
THIS IS A TEST STATEMENT3

如何实现?

我正在使用XDocument 加载文件:

XDocument X = XDocument.Load("myfile.xml");
var main = x.Element("queryResponse").Element("querySubjectResponse").Element("report").Element("informationReported").Element("aar");

我正在尝试通过此链接了解答案:Linq to XML

【问题讨论】:

  • "我想保存叙述并且对于每个叙述,将语句保存到一个数组中以供以后使用。" &lt;narrative&gt; 不包含 @987654327 @。您的意思是要将&lt;statement&gt; 保存在包含&lt;narrative&gt;&lt;report&gt; 中吗?你也嵌套了&lt;statement&gt;s,你想要最里面的一个吗?问题不清楚,您没有显示任何尝试,除了您将其加载为XDocument
  • 我用我想要保存的内容更新了我的问题,并且我能够获取元素并将其保存到 var 但不太确定之后如何继续。

标签: c# xml linq


【解决方案1】:

假设每个报告都有叙述和可选声明,这应该适用于您:

XElement root = XElement.Load(file);
List<string> list = root.Descendants("report")
    .SelectMany(report =>
    {
        List<string> sub = new List<string>();
        sub.Add(report.Descendants("narrative").First().Value);
        string statement = (string)report.Descendants("statement")
                        .FirstOrDefault(s => s.Elements().Any() == false);
        sub.Add(statement ?? "NULL");
        return sub;
    })
    .ToList();

如果您希望将叙述和陈述放在单独的列表中,请改为:

var list = root.Descendants("report")
    .Select(report => new
    {
        Narrative = report.Descendants("narrative").First().Value,
        Statement = ((string)report.Descendants("statement")
                        .FirstOrDefault(s => s.Elements().Any() == false))
                    ?? "NULL"
    })
    .ToList();

【讨论】:

  • 对于第二个或第一个选项,是否可以将叙述和陈述包含在不同的列表中?
  • 另外,对于此代码:sub.Add(report.Descendants("statement") .Where(statement =&gt; statement.Elements().Any() == false) .First().Value); 我收到Sequence contains no elements 错误。
  • @SiKni8 那么不是每个报告都包含声明。
  • 第三个statement 节点丢失。如果它丢失并且仍然能够使其工作,我可以输入 NULL 吗?还要记住,在父 statement 中有一个子 statement。我想要孩子statement
  • @SiKni8 删除了第一个代码,所以我不必继续重复工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多