0

動的に生成された xml ドキュメントを含む C# .NET アプリがあります。名前、注文日などの注文情報を追跡します。innerText を使用して、これらのタグに含まれる情報を抽出しても問題はありません。

ただし、注文がお客様によって「構築」されると、ファイルを添付することが許可されます....

各ファイルは、タグの下の xml doc に保存されます。

だから私はこのような(単純化された)ものになります:

<order>
   <Number>1</Number>
   <Email>example@stack.com</Email>
   <Date>2012-08-13</Date>
   <File>File1.txt</File>
   <File>File2.txt</File>
</order>

私が言ったように、私は他の情報を抽出します

   foreach (XmlElement element in file.SelectNodes("/order"))
   {
       String strNumber = element.SelectSingleNode("Number").InnerText,
               strEmail = element.SelectSingleNode("Email").InnerText,
                strDate = element.SelectSingleNode("Date").InnerText;
   } 

ただし、名前でこれを行うと、インスタンスに設定されていないというエラーが発生します...これは完全に理解しています。

私の質問は、どうすればこの情報を取得できますか? ゼロからユーザーが必要とする数まで、任意の数のファイルを添付できます。

お時間をいただきありがとうございます。

4

3 に答える 3

1

これがコード例です。

順序はxmlの順序を表します

[TestFixture]
public class ForTest
{
    [Test]
    public void Test()
    {
        var root = XElement.Load("order.xml");
        var order = CreateOrder(root);
    }

    private Order CreateOrder(XElement element)
    {
        var result = new Order
        {
            Number = int.Parse(element.Element("Number").Value),
             Date = DateTime.Parse(element.Element("Date").Value),
            Email = element.Element("Email").Value,
            Files = element.Descendants("File").Select(x => x.Value).ToList()
        };
        return result;
    }
}
public class Order
{
    public int Number { get; set; }
    public string Email { get; set; }
    public DateTime Date { get; set; }
    public List<string> Files { get; set; }
}
于 2012-08-13T20:00:58.560 に答える
1

プロパティがわかっている場合は、シリアル化を使用してこれを行うことができます

[XmlRoot("order")]
public class order
{
[XmlElement("Number")]
public string  Number{get;set;}
[XmlElement("Email")]
public string  Email{get;set;}
[XmlElement("Date")]
public string  Date{get;set;}
[XmlElement("File")]
public string[] File{get;set;}
}

以下のコードはデシリアライズするためのものです

    public static T DeSerializeXMLString<T>(string xmlString)
    {
        XmlSerializer xs = new XmlSerializer(typeof(T));
        MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
        return (T)xs.Deserialize(memoryStream);
    }
于 2012-08-13T20:05:15.287 に答える
0

LINQベースのソリューションは次のとおりです。

XDocument XMLDoc = XDocument.Load("XMLFile.xml");
var LoadInfo =  from Node in XMLDoc.Descendants("order")                       
                select new
                  {
                    Number = Node.Element("Number").Value,
                    Email = Node.Element("Email").Value,
                    Date = Node.Element("Date").Value,
                    File = Node.Element("File").Value,
                  };

使用法:

    foreach(var Info in LoadInfo)
    {
      //Do something with the info.
      //Console.WriteLine(Info.Email);
    }
于 2012-08-13T20:01:06.797 に答える