2

私はこのxmlファイルを持っています。特定の servername 属性のすべての dbistance を取得しようとしています。dbistance 情報グループごとに、この DEFAULT - DBCATALOG - USERNAME - PASSWORD - 1433 のような連結の結果をリストボックスに追加します... linq が嫌いになり始めています :)

    <?xml version="1.0" encoding="utf-8" ?>
<root>
  <server servername="SRV01">
    <dbistance>
      <istancename>DEFAULT</istancename>
      <catalog>DBCATALOG01</catalog>
      <username>USERNAME</username>
      <password>PASSWORD</password>
      <port>1433</port>
    </dbistance>
    <dbistance>
      <istancename>DEFAULT</istancename>
      <catalog>DBCATALOG02</catalog>
      <username>USERNAME</username>
      <password>PASSWORD</password>
      <port>1433</port>
    </dbistance>
  </server>

  <server servername="SRV02">
    <dbistance>
      <istancename>DEFAULT</istancename>
      <catalog>DBCATALOG01</catalog>
      <username>USERNAME</username>
      <password>PASSWORD</password>
      <port>1433</port>   
    </dbistance>
  </server>
</root>
4

2 に答える 2

1

これを試して

var doc = XDocument.Load(new StringReader(xml));
var result = doc.Root
                .Descendants("dbistance")
                .Select(elem => elem.Descendants()
                                    .Select(elem2 => elem2.Value)
                                    .Aggregate((current, next) => current + " - " + next));
于 2012-12-01T17:56:11.487 に答える
1

xml の解析と結果の書式設定を 2 つのアクションに分割します。しかし、ここに単一のクエリがあります:

XDocument xdoc = XDocument.Load(path_to_xml);
string serverName = "SRV01";
IEnumerable<string> dbInstances =
            xdoc.Descendants("server")
                .Where(s => (string)s.Attribute("servrname") == serverName)
                .Descendants("dbinstance")
                .Select(db => String.Format("{0} - {1} - {2} - {3} - {4}", 
                    (string)db.Element("istancename"),
                    (string)db.Element("catalog"),
                    (string)db.Element("username"),
                    (string)db.Element("password"),
                       (int)db.Element("port")));

ところで、istancenameタグにタイプミスがあります。


データを保持し、フォーマットを行うクラスを作成することも検討してください。

public class DbInstance
{
    public string InstanceName { get; set; }
    public string Catalog { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public int Port { get; set; }

    public override ToString()
    {
        return String.Format("{0} - {1} - {2} - {3} - {4}", 
                  InstanceName, Catalog, UserName, Password, Port));
    }
}

xml を解析します (DbInstance オブジェクトのコレクションを返す別のメソッドで実行できます)。

XDocument xdoc = XDocument.Load(path_to_xml);
string serverName = "SRV01";
IEnumerable<DbInstance> dbInstances =
            xdoc.Descendants("server")
                .Where(s => (string)s.Attribute("servrname") == serverName)
                .Descendants("dbinstance")
                .Select(db => new DbInstance() {
                    InstanceName = (string)db.Element("istancename"),
                    Catalog = (string)db.Element("catalog"),
                    UserName = (string)db.Element("username"),
                    Password = (string)db.Element("password"),
                    Port = (int)db.Element("port") });

インスタンスをリストボックスに割り当てるだけです (オーバーライドされた ToString メソッドが機能します)。

listBox.DataSource = dbInstances;
于 2012-12-01T18:12:26.263 に答える