1

この XML ファイルを読み込もうとしています:

<server>
  <Version date="06/05/2013">2.5.4</Version>
  <Lastfix path="\">Now reading basic config files! Read the README file!</Lastfix>
  <Version date="07/05/2013">2.5.3</Version>
  <Lastfix path="\wServer\ClientProcessor.cs">Fixed character creation bugs (related to mysql, download and import the new struct.sql file under db!)</Lastfix>
  <Version date="06/05/2013">2.5.0</Version>
  <Lastfix path="\">BIG stability fix, register fix, buy gold fix</Lastfix>
  <Version date="02/05/2013">2.4.1</Version>
  <Lastfix path="\wServer\realm\entities\player\Player.UseItem.cs">Almost finished dungeon keys!</Lastfix>
  <Version date="30/04/2013">2.3.1</Version>
  <Lastfix path="\wServer\realm\entities\player\Player.UseItem.cs">Dungeon keys now working!</Lastfix>
  <Version date="30/04/2013">2.3.0</Version>
  <Lastfix path="\wServer\realm\entities\player\Player.Chat.cs">Added /who, /tell, /server commands!</Lastfix>
</server>

しかし、バージョンと lastfix テキスト値を取得する方法がわかりません!

私はこのコードを試していました。

XmlDocument version = new XmlDocument();
version.Load(path);

foreach (XmlNode node in version.SelectNodes("server"))
{
    MessageBox.Show(node.SelectSingleNode("lastfix_date").InnerText);
}

でも成功しない

4

3 に答える 3

1

おそらく xmlpath ソリューションほど「正しい」ものではありませんAggregate()が、できる限り linq を使用するのが好きなので、謙虚なソリューションを提示します。

void Main()
{
  XmlDocument v = new XmlDocument();
  v.LoadXml(@"<server>
<Version date=""06/05/2013"">2.5.4</Version>
<Lastfix path=""\"">Now reading basic config files! Read the README file!</Lastfix>
<Version date=""07/05/2013"">2.5.3</Version>
<Lastfix path=""\wServer\ClientProcessor.cs"">Fixed character creation bugs (related to mysql, download and import the new struct.sql file under db!)</Lastfix>
<Version date=""06/05/2013"">2.5.0</Version>
<Lastfix path=""\"">BIG stability fix, register fix, buy gold fix</Lastfix>
<Version date=""02/05/2013"">2.4.1</Version>
<Lastfix path=""\wServer\realm\entities\player\Player.UseItem.cs"">Almost finished dungeon keys!</Lastfix>
<Version date=""30/04/2013"">2.3.1</Version>
<Lastfix path=""\wServer\realm\entities\player\Player.UseItem.cs"">Dungeon keys now working!</Lastfix>
<Version date=""30/04/2013"">2.3.0</Version>
<Lastfix path=""\wServer\realm\entities\player\Player.Chat.cs"">Added /who, /tell, /server commands!</Lastfix>
</server>");

  var result = v.SelectSingleNode("server").ChildNodes.OfType<XmlNode>().Aggregate(
     new List<item>(),
     (list, node) => {
      if (node.Name == "Version")
      {
        list.Add(new item { versionD = node.Attributes["date"].Value, versionN = node.InnerText, lastfix = "" });
        return list;
      }
      else
      {
        list.Last().lastfix = node.InnerText;
        return list;
      }
    });

  result.Dump();
}

public class item {
  public string versionD { get; set; }
  public string versionN { get; set; }
  public string lastfix { get; set; }
}

戻り値

結果

linqPad で実行する場合 (linqPad.com)

于 2013-06-22T19:06:57.517 に答える
0

これはLinqベースのソリューションです(XmlDocumentを使用していますが、必須であると指定しないでください)

XDocument xDoc = XDocument.Load(@"C:\myServerFile.xml");
List<string> serverVersions = new List<string>();
foreach (var element in xDoc.Elements("server").Elements("Version"))
{
       string version = (string)element + " " + (string)((XElement)element.NextNode);
       serverVersions.Add(version);
}

その後、文字列の「serverVersions」リストを使用して、好きなことを行うことができます

于 2013-06-22T19:09:03.113 に答える