在xml C#中查找值

时间:2012-08-10 09:17:59

标签: c# asp.net xml

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

3 个答案:

答案 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.

然后,您可以将XPathSelectNodes()SelectNode()方法结合使用。

像:

XmlNodeList xmlNodes = xmlDoc.SelectNodes("/translations/key[@name=\"BillOfMaterials\"]/translation[@culture=\"en-GB\"]");