给出这个xml(只是一部分..)
<?xml version="1.0" encoding="utf-8"?>
<translations>
<key name="BillOfMaterials">
<translation culture="en-GB"><![CDATA[Bill of materials]]>
</translation>
<translation culture="da-DK"><![CDATA[Materiale liste]]>
</translation>
</key>
<key name="TechnicalDetails">
<translation culture="en-GB">
<![CDATA[Technical details
]]>
</translation>
</key>
..
..
...我正在寻找最简单的解决方案来查找:
所以
string thisTranslation = GetTranslation("BillOfMaterials","en-GB"); //value gets to be "Bill of materials"
我已经尝试过linq方式了,但是它太多了太多了......尤其是当xslt中的一个简单的xpath就足够了......但我似乎无法做到这一点
提前致谢
编辑: - xml是物理文件 - 函数可能找不到任何东西.....应该只返回原始密钥名称
/translations/key[@name="BillOfMaterials"]/translation[@culture="en-GB"]
是其他地方可用的xpath ..
答案 0 :(得分:2)
您可以在XElement上使用XPathSelectElement
扩展方法设置XPath选择器:
将XML加载到XDocument中:
var doc = XDocument.Load("path\to\file");
然后用XPath搜索它:
var translation = (string)doc.XPathSelectElement(string.format("/translations/key[@name=\"{0}\"]/translation[@culture=\"{1}\"]", key, culture));
if(string.IsNullOrEmpty(translation))
translation = key;
return translation;
答案 1 :(得分:2)
我仍然会使用LINQ to XML - 完全没有必要让它变得凌乱:
XDocument doc = XDocument.Load("test.xml");
string key = "BillOfMaterials";
var element = doc.Root.Elements("key")
.Where(key => key.Attribute("name").Value == key)
.Elements("translation")
.Where(tr => tr.Attribute("culture").Value == "en-GB")
.FirstOrDefault();
string result = (string) element ?? key;
我个人认为比使用XPath更清洁(即使XPath无可否认更短)。它可以更清楚地分离查询的每个部分,如果需要任何命名空间处理,使用LINQ to XML比使用命名空间管理器更简单。
答案 2 :(得分:0)
以XmlDocument
类型获取Xml文档。你可以这样做:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("<xml>"); // Can be a XML in a string, or filename, etc.
然后,您可以将XPath
与SelectNodes()
和SelectNode()
方法结合使用。
像:
XmlNodeList xmlNodes = xmlDoc.SelectNodes("/translations/key[@name=\"BillOfMaterials\"]/translation[@culture=\"en-GB\"]");