代码之家  ›  专栏  ›  技术社区  ›  DaveDev

如何从片段字符串将XML加载到可操作的对象中?

  •  2
  • DaveDev  · 技术社区  · 14 年前

    我在一个字符串中有一个XML框架(只有几个节点,而不是一个完整的XML文档),我需要从linq-to-xml中获取一些值。我发现很难将这个字符串转换成我可以使用的XML对象。

    我有办法做到这一点吗?

    这是XML的一个示例:

    <Batch type="My Funds" pageNumber="69">
      <FundGroup heading="Best Funds Ever">
        <fund id="367"/>
        <fund id="373"/>
        <fund id="378"/>
      </FundGroup>
      <FundGroup heading="Almost Best Funds">
        <fund id="665"/>
        <fund id="666"/>
        <fund id="667"/>
      </FundGroup>
    </Batch>
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   Marc Gravell    14 年前

    XML是完整的,所以任何XML模型都可以工作。 XmlSerializer 例如,应该很好;但是对于匿名类型的特殊模型呢?

            var doc = XElement.Parse(xml);
            var batch = new {
                Type = (string)doc.Attribute("type"),
                Page = (int)doc.Attribute("pageNumber"),
                Groups = (from fg in doc.Elements("FundGroup")
                          select new {
                              Heading = fg.Attribute("heading"),
                              Funds = (from fund in fg.Elements("fund")
                                       select (int)fund.Attribute("id")).ToList()
                          }).ToList()
            };
    

    现在探索 batch -P

        2
  •  1
  •   Anthony Pegram    14 年前

    你应该能做到。如果有多个批处理元素,并且您的代码段中只包含一个,那么您可能需要将整个代码段包装在一个根目录中。 <Batches> {xml} </Batches> 所以你可以使用它。如果是的话,我在哪里说

    var query = from batch in document.Elements("Batch") ...
    

    将其修改为

    ... document.Root.Elements("Batch") or document.Descendants("Batch")
    

    代码:

    string xml = @"<Batch type=""My Funds"" pageNumber=""69""> 
                        <FundGroup heading=""Best Funds Ever""> 
                        <fund id=""367""/> 
                        <fund id=""373""/> 
                        <fund id=""378""/> 
                        </FundGroup> 
                        <FundGroup heading=""Almost Best Funds""> 
                        <fund id=""665""/> 
                        <fund id=""666""/> 
                        <fund id=""667""/> 
                        </FundGroup> 
                    </Batch>";
    
    XDocument document = XDocument.Parse(xml);
    
    var query = from batch in document.Elements("Batch")
                select new
                {
                    Type = batch.Attribute("type").Value,
                    PageNumber = (int)batch.Attribute("pageNumber"),
                    FundGroups = from fundGroup in batch.Elements("FundGroup")
                                    select new
                                    {
                                        Heading = fundGroup.Attribute("heading").Value,
                                        Funds = from fund in fundGroup.Elements("fund")
                                                select new { Id = (int)fund.Attribute("id") }
                                    }
                };
    
        3
  •  0
  •   Adrian    14 年前

    只要有整个节点,就可以将字符串包装在单个元素标记中并加载它。

    “<xml>”+myfragment+“</xml>”;