我有像这样的XML文档
<document>
<indexroot>
<type>type</type>
<model>model</model>
</indexroot>
<root>
<model_type1>model type 1</model_type1>
<model_type2>model type 2</model_type2>
</root>
</document>
和linq到xml代码:
var elements = (from element in pdb.Descendants()
select new
{
type = (string)element.Element("type") ?? "-",
model= (string)element.Element("model") ?? "-",
model_type1= (string)element.Element("model_type1") ?? "-",
model_type2= (string)element.Element("model_type2") ?? "-"
}).FirstOrDefault();
我得到了类型和模型变量,但似乎我无法达到model_type1和model_type2,现在我明白这是因为indexroot和root标签,如果我将这些标签分隔成不同的linq到xml代码块与后代(“indexroot”)和Descendants(“root”),一切正常,但我不是一个块,是否有可能实现这一点,以及如何实现?
答案 0 :(得分:0)
您需要为要提取的每个元素向下导航XML层次结构。
这是因为Element方法只查看直接子节点,而不是节点的所有后代。来自the documentation:
获取具有指定XName的第一个(按文档顺序)子元素。
仅使用Linq-to-XML的一个实现可能是:
xml = "<document>" +
"<indexroot>" +
" <type>type</type>" +
" <model>model</model>" +
"</indexroot>" +
"<root>" +
" <model_type1>model type 1</model_type1>" +
" <model_type2>model type 2</model_type2>" +
"</root>" +
"</document>";
XDocument doc = XDocument.Parse(xml);
var newItem = (from element in doc.Descendants("document")
select new
{
Type = (string)element.Element("indexroot").Element("type") ?? "-",
Model = (string)element.Element("indexroot").Element("model") ?? "-",
ModelType1 = (string)element.Element("root").Element("model_type1") ?? "-",
ModelType2 = (string)element.Element("root").Element("model_type2") ?? "-",
}).FirstOrDefault();
Console.WriteLine(newItem);