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

XPathSelectElementXPathセレクターでXElementに設定された拡張メソッドを使用できます。

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

私はまだLINQtoXMLを使用します-それが乱雑になる必要はまったくありません:

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は間違いなく短いですが)。クエリの各セクションをより明確に分離します。また、名前空間の処理が必要な場合は、名前空間マネージャーをいじるよりもLINQtoXMLを使用すると非常に簡単になります。

于 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.

XPath次に、SelectNodes()andSelectNode()メソッドで使用できます。

好き:

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