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

时间:2010-04-23 15:22:47

标签: c# xml linq-to-xml

我在一个字符串中有一段XML(只有几个节点,而不是一个完整的XML文档),我需要从Linq到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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

你应该能够做到这一点。如果有多个批处理元素,并且您只在代码段中包含了一个,则需要将整个代码段包装在根目录中,可能是<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") }
                                }
            };

答案 2 :(得分:0)

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

“&LT; XML&gt;” 中+ myFragment +“&lt; / xml&gt;”;