【问题标题】:Linq to XML get nested child attribute based on parent attributeLinq to XML 获取基于父属性的嵌套子属性
【发布时间】:2015-06-25 12:32:14
【问题描述】:

我需要一些关于 LINQ to XML 的帮助。我很想恢复到 XPath,但我非常热衷于正确学习 LINQ to XML。 所以下面是我的 XML 的精简版:

<SData Key="626">
<Event OID="INITIALVISIT">
    <FData FID="MODAL_V10">
        <IGData IOID="MODALITYTABLE">
            <Item OID="I_TABLE_MODAL_DATE_TABLE" Value="2015-06-03" />
            <Item OID="I_TABLE_MODAL_TYPE_TABLE" Value="1" />
        </IGData>
        <IGData IOID="MODALITYTABLE2">
            <Item OID="I_TABLE_MODAL_DATE_TABLE2" Value="2015-06-09" />
            <Item OID="I_TABLE_MODAL_TYPE_TABLE2" Value="1" />
        </IGData>
    </FData>
    <FData FID="UPLOAD_V40">
        <IGData IOID="IG_IMAGE_UNGROUPED">
            <Item OID="I_IMAGE_UPLOAD_XNAT" Value="1" />
            <Item OID="I_IMAGE_UPLOAD_COMPLETE" Value="1" />
        </IGData>
        <IGData IOID="IG_IMAGE_UPLOAD">
            <Item OID="I_IMAGE_UPLOAD_XNAT" Value="1" />
            <Item OID="I_IMAGE_UPLOAD_COMPLETE" Value="1" />
        </IGData>
    </FData>
</Event>
<Event OID="FOLLOWUPVISIT">
...
...
</Event>

我想要实现的是为每个事件获取属性 OID="I_IMAGE_UPLOAD_COMPLETE" 的项目的值。这是我目前所拥有的。

            XNamespace occ = "http://www.cdisc.org/ns/odm/v1.3";
            XNamespace aoc = "http://www.openclinica.org/ns/odm_ext_v130/v3.1";

            var datasubject = data_oc.Descendants(occ + "SData");
            var event = datasubject.Elements(occ + "Event").Attributes("OID");

            foreach (var items in event)
            {
                string EventTypes = items.Value.ToString();
                foreach (var itemData in EventTypes)
                {
                    var Data = from el in datasubject.Descendants(occ + "Event")
                               where (string)el.Attribute("OID=") == itemData
                               select(string)el;
                }
            }

谢谢。

【问题讨论】:

  • 使用现有代码时遇到什么异常?

标签: c# xml linq attributes


【解决方案1】:

试试这个,不知道它的性能如何。

 XDocument po = XDocument.Load("XMLFile1.xml");
        // LINQ to XML query
        var list1 = po.Descendants("Event")
                        .Select(x =>
                            x.Descendants("Item").Where(t =>
                                (string)t.Attribute("OID") == "I_IMAGE_UPLOAD_COMPLETE").Select(m => 
                                    new { Event = x, AttributeValue = m.Attribute("Value") })
                                ).Where(f => f.FirstOrDefault() != null).ToList();

【讨论】:

    【解决方案2】:
    var doc=XDocument.Parse(@"your xml");
    
    //Via Linq
    var viaLinq=doc.Elements()
      .SelectMany(e => e.Elements())
      .SelectMany(e => e.Elements())
      .SelectMany(e => e.Elements())
      .SelectMany(e => e.Elements())
      .Where(w => w.Attribute("OID").Value=="I_IMAGE_UPLOAD_XNAT")
      .Select(e => e.Attribute("Value").Value);
    
    //Even better use Xpath. It makes all this very simple
    var viaXPath=doc.XPathSelectElements("//Item[@OID='I_IMAGE_UPLOAD_XNAT']")
      .Select(e => e.Attribute("Value").Value);
    

    【讨论】:

    • 我想为每个事件获取价值项目
    • 编辑了现在将返回值的答案。你在找这个吗?
    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多