C# 在一条语句中从Xml文档中选择多个值
我试图同时使用C# 在一条语句中从Xml文档中选择多个值,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我试图同时使用 var values = xDoc.Element("root") .Elements("model") .Where(x => x.Element("modelName").Value == modelType.ToString()) .Elements("directory") .Select(x => new {
var values =
xDoc.Element("root")
.Elements("model")
.Where(x => x.Element("modelName").Value == modelType.ToString())
.Elements("directory")
.Select(x => new { x.Element("directoryName").Value,
x.Element("taskName").Value });
我在.Value
s下面看到红色的曲线,上面写着“复制匿名类型属性名'Value'。
这是xml
<root>
<model>
<modelName>Model1</modelName>
<directory>
<directoryName>Dir1</directoryName>
<taskName>Task1</taskName>
</directory>
</model>
<model>
<modelName>Model2</modelName>
<directory>
<directoryName>FirstValue</directoryName>
<taskName>SecondValue</taskName>
</directory>
</model>
</root>
模型1
Dir1
任务1
模型2
第一价值
第二价值
我想提取Dir1和Task1或FirstValue和SecondValue。解决了这个问题,您只需要在匿名类型中命名属性
var values =
xDoc.Element("root")
.Elements("model")
.Where(x => x.Element("modelName").Value == modelType.ToString())
.Elements("directory")
.Select(x => new { Directory = x.Element("directoryName").Value,
Task = x.Element("taskName").Value });
我建议您使用强制转换元素来字符串,而不是访问它们的
值
属性。因为如果缺少元素(例如对于Model1
您没有taskName
元素),那么您将得到NullReferenceException
var values = from m in xDoc.Root.Elements("model")
where (string)m.Element("modelName") == modelType.ToString()
let d = m.Element("directory")
select new {
Directory = (string)d.Element("directoryName"),
Task = (string)d.Element("taskName")
};
此外,我发现声明性(查询)语法比lambda语法更具可读性(品味问题)。您还可以使用XPath使查询更加紧凑:
string xpath = String.Format("root/model[modelName='{0}']/directory", modelType);
var values = from d in xdoc.XPathSelectElements(xpath)
select new {
Directory = (string)d.Element("directoryName"),
Task = (string)d.Element("taskName")
};
@reggaeguitar您的代码对您提供的示例xml引发异常。请使用
modelType=“Model1”
尝试该方法,您必须为模型类型提供枚举,例如modelType.Model2,它将在ToString()上变成字符串“Model2”call.我刚刚为xDoc.Root属性填写了xml.+1,我没有意识到这一点。@reggaeguitar谢谢!顺便说一句,我添加了xpath示例,您可能会感兴趣,它非常酷!我通过了单元测试,并以优异的成绩通过了测试。