2

私はこのxmlを持っています:

<?xml version="1.0" encoding="utf-8" ?>
<Interfaces>
  <Interface>
    <Name>Account Lookup</Name>
    <PossibleResponses>
      <Response>Account OK to process</Response>
      <Response>Overridable restriction</Response>
    </PossibleResponses>
  </Interface>
  <Interface>
    <Name>Balance Inquiry</Name>
    <PossibleResponses>
      <Response>Funds available</Response>
      <Response>No funds</Response>
    </PossibleResponses>
  </Interface>
</Interfaces>

インターフェイスの可能な応答を取得する必要があります。

// Object was loaded with XML beforehand    
public class Interfaces : XElement {
    public List<string> GetActionsForInterface(string interfaceName) {
        List<string> actionList = new List<string>();
        var actions = from i in this.Elements("Interface")
                      where i.Element("Name").Value == interfaceName
                      select i.Element("PossibleResponses").Element("Response").Value;

        foreach (var action in actions)
            actionList.Add(action);

        return actionList;
    }
}

結果は次のようなリストになるはずです (インターフェイス 'Account Lookup' の場合):
Account OK to process
Overridable 制限

しかし、最初の値「Account OK to process」のみを返します。ここで何が問題なのですか?

編集:
方法を変更しました:

public List<string> GetActionsForInterface(string interfaceName) {
    List<string> actionList = new List<string>();
    var actions = from i in this.Elements("interface")
                  where i.Element("name").Value == interfaceName
                  select i.Element("possibleresponses").Elements("response").Select(X => X.Value);

    foreach (var action in actions)
        actionList.Add(action);

    return actionList;
}

しかし、「actionList.Add(action);」行で 2 つのエラーが発生しました。

The best overloaded method match for System.Collections.Generic.List<string>.Add(string)' has some invalid arguments 
Argument 1: cannot convert from 'System.Collections.Generic.IEnumerable<char>' to 'string'

多くの選択が結果を文字列以外のものにキャストしていると思いますか?

編集:
最後のエラーを修正するには:

    foreach (var actions in query)
        foreach(string action in actions)
            actionList.Add(action);

どうやらここには配列内に配列があるようです。

4

3 に答える 3

4

これ

select i.Element("PossibleResponses").Element("Response")

最初の「応答」要素を返します。代わりに要素を使用してください。

次に、値を取得するために多くを選択する必要があります。

于 2012-09-12T09:21:42.217 に答える
0
static List<string> GetActionsForInterface(string interfaceName)
{
  var doc = XDocument.Parse(xml);
  List<string> actionList = new List<string>();
  var actions = doc.Root
    .Elements("Interface")
    .Where(x => x.Element("Name").Value == interfaceName).
    Descendants("Response").Select(x => x.Value);

  foreach (var action in actions)
    actionList.Add(action);

  return actionList;
}
于 2012-09-12T09:24:37.530 に答える
0
doc.Root.Elements("Interface").Select(e=>new {
 Name = e.Element("Name").Value,
 PossibleResponses = e.Element("PossibleResponses").Elements("Response").select(e2=>e2.Value)
});
于 2012-09-12T09:29:34.330 に答える