我在一个字符串中有一段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>
答案 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;”;