1

「Qualities」の値からノードの名前を選択し、「qualityNames」で名前が以前にキャプチャされたノード内の値を選択する XPath 式を作成しようとしています。

たとえば、「Qualities」では値「4」を取得し、名前「rarity3」を取得し、「qualityNames」では「rarity3」という名前のノードを取得し、値「amazingrarity」を取得します

<result>
  <status>1</status>
  <qualities>
    <Normal>0</Normal>
    <rarity1>1</rarity1>
    <rarity2>2</rarity2>
    <vintage>3</vintage>
    <rarity3>4</rarity3>
    <rarity4>5</rarity4>
  </qualities>
  <qualityNames>
    <Normal>Normal</Normal>
    <rarity1>Genuine</rarity1>
    <rarity2>rarity2</rarity2>
    <vintage>Vintage</vintage>
    <rarity3>amazingrarity</rarity3>
    <rarity4>Unusual</rarity4>
  </qualityNames>
</result>

私はこれを C# で行っています (これは MVC アプリです)。XML のインデックスを作成していて、インメモリ手法をクエリする最速の方法が見つからないため、XPath を使用することをお勧めします (この XML ファイルのサイズは ~3MB です)。私は IndexingXPathNavigator を使用しています)。

4

3 に答える 3

4

local-name() および text() 関数 + 述語を使用します。値「4」の場合、

//qualityNames/*[local-name()=local-name(//qualities/*[text() = '4'])]

http://www.xpathtester.comでテスト済み

于 2013-05-27T20:57:22.940 に答える
1

キーと値のペアの辞書を作成したいようです (ノード名は一致を見つけるためだけに必要であり、コードにとって重要ではないと仮定します)。

その場合は、次を使用できます。

var doc = XElement.Parse(@"<result>
<status>1</status>
<qualities>
    <Normal>0</Normal>
    <rarity1>1</rarity1>
    <rarity2>2</rarity2>
    <vintage>3</vintage>
    <rarity3>4</rarity3>
    <rarity4>5</rarity4>
</qualities>
<qualityNames>
    <Normal>Normal</Normal>
    <rarity1>Genuine</rarity1>
    <rarity2>rarity2</rarity2>
    <vintage>Vintage</vintage>
    <rarity3>amazingrarity</rarity3>
    <rarity4>Unusual</rarity4>
</qualityNames>
</result>");

var query = from quality in doc.XPathSelectElements("qualities/*")
            join qualityName in doc.XPathSelectElements("qualityNames/*")
            on quality.Name equals qualityName.Name
            select new { Key = quality.Value, Value = qualityName.Value };
var qualities = query.ToDictionary(a => a.Key, a => a.Value);
var quality3 = qualities["3"];
// quality3 == "Vintage"
var quality4 = qualities["4"];
// quality4 == "amazingrarity"

編集: この辞書をキャッシュする方法の例

// add reference to System.Web dll
public Dictionary<string, string> GetQualities()
{
    // assuming this code is in a controller
    var qualities = this.HttpContext.Cache["qualities"] as Dictionary<string, string>;
    if (qualities == null)
    {
        // LoadQualitiesFromXml() is the code above
        qualities = LoadQualitiesFromXml();
        this.HttpContext.Cache["qualities"] = qualities;
    }
    return qualities;
}
于 2013-05-28T01:16:57.470 に答える
0

これはあなたが尋ねたものだと思います

        var rarity3ValueInQualities = xml.SelectSingleNode("/result/qualities/rarity3").InnerText;
        var rarity3ValueInqualityNames = xml.SelectSingleNode("/result/qualityNames/rarity3").InnerText;
于 2013-05-27T21:05:34.207 に答える