0

给定这个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..

4

3 回答 3

2

您可以XPathSelectElement将 XElement 上设置的扩展方法与 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;
于 2012-08-10T09:25:45.360 回答
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 比使用命名空间管理器要简单得多。

于 2012-08-10T09:26:47.957 回答
0

获取您的 XML 文档XmlDocument类型。你可以这样做:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("<xml>"); // Can be a XML in a string, or filename, etc.

然后你可以使用XPathwithSelectNodes()SelectNode()方法。

喜欢:

XmlNodeList xmlNodes = xmlDoc.SelectNodes("/translations/key[@name=\"BillOfMaterials\"]/translation[@culture=\"en-GB\"]");
于 2012-08-10T09:23:49.120 回答