以下是代码段:
XDocument themes = XDocument.Load(HttpContext.Current.Server.MapPath("~/Models/Themes.xml"));
string result = "";
var childType = from t in themes.Descendants()
where t.Attribute("name").Value.Equals(theme)
select new { value = t.Attribute("type").Value };
foreach (var t in childType) {
result += t.value;
}
return result;
这是XML:
<?xml version="1.0" encoding="utf-8" ?>
<themes>
<theme name="Agile">
<root type="Project">
<node type="Iteration" >
<node type="Story">
<node type="Task"/>
</node>
</node>
</root>
</theme>
<theme name="Release" >
<root type="Project">
<node type="Release">
<node type="Task" />
<node type="Defect" />
</node>
</root>
</theme>
</themes>
我做错了什么?我不断收到“未设置为对象实例的对象”异常。
我想要返回的是基于父节点类型的所选节点的类型,即,如果主题是“敏捷”而父节点是“Project”,则返回值应为“迭代”。这是最后的结果,但我从来没有那么远,因为我坚持你上面看到的。
答案 0 :(得分:5)
我想你想要更接近这个:
XDocument themes = XDocument.Load(HttpContext.Current.Server.MapPath("~/Models/Themes.xml"));
string result = "";
var childType = from t in themes.Descendants("theme")
where t.Attribute("name").Value.Equals(theme)
select new { value = t.Descendants().Attribute("type").Value };
foreach (var t in childType) {
result += t.value;
}
return result;
修改强> 根据您的其他信息,这可能更接近:
XDocument themes = XDocument.Load(HttpContext.Current.Server.MapPath("~/Models/Themes.xml"));
string result = "";
var childType = from t in themes.Descendants("theme")
where t.Attribute("name").Value.Equals(theme)
where t.Element("node").Attribute("type").Value == parent
select new { value = t.Descendants().Attribute("type").Value };
foreach (var t in childType) {
result += t.value;
}
return result;
编辑2:这对我有用:
XDocument themes = XDocument.Load(HttpContext.Current.Server.MapPath("~/Models/Themes.xml"));
string result = "";
var theme = "Agile";
var parent = "Project";
var childType = from t in themes.Descendants("theme")
where t.Attribute("name").Value.Equals(theme)
where t.Element("root").Attribute("type").Value == parent
from children in t.Element("root").Descendants()
select new { value = children.Attribute("type").Value };
foreach (var t in childType) {
result += t.value;
}
return result;
编辑3:这是完整的工作程序,只需将其放入控制台应用程序的类中即可。
static void Main(string[] args)
{
var xml = "<themes><theme name='Agile'><root type='Project'><node type='Iteration' ><node type='Story'><node type='Task'/></node></node></root></theme><theme name='Release' ><root type='Project'><node type='Release'><node type='Task' /><node type='Defect' /></node></root></theme></themes>";
XDocument themes = XDocument.Parse(xml);
string result = "";
var theme = "Agile";
var parent = "Project";
var childType = from t in themes.Descendants("theme")
where t.Attribute("name").Value.Equals(theme)
where t.Element("root").Attribute("type").Value == parent
from children in t.Element("root").Descendants()
select new { value = children.Attribute("type").Value };
foreach (var t in childType)
{
Console.WriteLine(t.value);
}
Console.Read();
}
答案 1 :(得分:1)
好的,这就是我最后做的,它不是很漂亮,但它有效。 它基于Pramodh的回答,只有几个小时。
string result = "";
var childType = themes.Descendants("theme")
.Where(x => x.Attribute("name").Value == theme)
.Where(x => x.Descendants("node").First().Attribute("type").Value == parentType)
.Select(x => x.Descendants("node").First().Descendants().First().Attribute("type").Value);
foreach (var t in childType) {
result += t;
}
return result;
现在,如果我传入主题“敏捷”和父母“迭代”,它将返回故事。
就像我说的不是很漂亮,但它有效。
感谢所有发布答案的人。
答案 2 :(得分:0)
我对你的问题一无所知。这是我的解决方案(据我所知)
var childType = themes.Descendants("theme")
.Where(X => X.Attribute("name").Value == "Agile")
.Where(X => X.Descendants("root").Attributes("type").First().Value == "Project")
.Select(X => X.Descendants("node").Attributes("type").First().Value);
答案 3 :(得分:0)
您的查询中有两个错误。
首先是:
from t in themes.Descendants()
这将为您提供所有themes
个元素
如果您需要theme
元素,则必须通过以下方式进行指定:
from t in themes.Descendants("theme")
第二个错误将是
select new { value = t.Attribute("type").Value }
因为t
将是theme
元素,没有属性“type”
我无法帮助解决这个问题,因为不清楚最终结果必须是什么。
编辑:根据添加的信息,这应该可以解决问题:
var childType =
from t in doc.Descendants("theme")
where t.Attribute("name").Value.Equals(theme)
select t.Element("root")
.Element("node")
.Attribute("type").Value;
但是,这意味着从具有相同theme
名称的节点中检索多种类型
如果类型始终相同,则应考虑调用.SingleOrDefault()
。