如何从XML获取元素并将其发送到数组? C#

时间:2014-05-17 12:55:24

标签: c# xml windows

我有这个XML(一个小样本):

<response list='true'>
    <count>12</count>
    <post>
        <id>307</id>
        <from_id>123</from_id>
        <to_id>123</to_id>
        <date>123892128</date>
        <post_type>post</post_type>
        <text>Smth TExt</text>
        <attachments list='true'>
            <attachment>
                <type>photo</type>
                <photo>
                    <pid>123</pid>
                    <aid>-7</aid>
                    <owner_id>123</owner_id>
                    <src>http://url1.jpg</src>
                    <src_big>http://url2.jpg</src_big>
                    <src_small>http://url3.jpg</src_small>
                    <src_xbig>http://url4.jpg</src_xbig>
                    <src_xxbig>http://url5.jpg</src_xxbig>
                    <src_xxxbig>http://url6.jpg</src_xxxbig>
                    <width>990</width>
                    <height>1188</height>
                    <text/>
                    <created>135</created>
                    <access_key>67</access_key>
                </photo>
            </attachment>
            <attachment>...</attachment>
            <attachment>...</attachment>
        </attachments>
        <comments><count>0</count></comments>
        <likes><count>2</count></likes>
        <reposts><count>0</count></reposts>
    </post>
</response>

我需要从每个帖子中获取值并将其发送到这样的数组:

 int[] int_from_id;
 int[] comments_count;
 int[] owner_id;
 string[,] srcofxxxbig; //where [post, № of att]

我该怎么做?我可以从中得到数据 - 12,但我不能在每个帖子中获得元素的价值。它是Windows 8.1应用程序。 Visual Studio 2013。 我试过了(2 Paul Sasik):

  private void name(){
       XDocument parsedoc = XDocument.Parse(herelinktoxmldoc);
       foreach (XElement i in parsedoc.Root.Elements())
      {
         if (w==0)
         {
             count =  Convert.ToInt32(i.Value);
         }
         w++;
     }
     count += 0;
     string[] post_from_id = new String[count];
     string[] post_to_id = new String[count];
     string[] post_date = new String[count];
     string[] post_text = new String[count];
     for (int i = 0; i < count; i++)
     {

         post_from_id[i] = ParsingXmlwoReq(wallxmlstring, "from_id");
         post_to_id[i] = ParsingXmlwoReq(wallxmlstring, "to_id");
         post_date[i] = ParsingXmlwoReq(wallxmlstring, "date");
         post_text[i] = ParsingXmlwoReq(wallxmlstring, "text");

     }
     }
     }
    private string ParsingXmlwoReq(string request, string whatget)
    {
        XDocument parsedoc = XDocument.Parse(request);
        string forreturn = "Null";
        var get = (from uri in parsedoc.Descendants(whatget) select uri.Value);
        foreach (var element in get)
        {
            forreturn = System.Convert.ToString(element);

        }
        return forreturn;
     }

1 个答案:

答案 0 :(得分:1)

您正试图以最复杂的方式阅读XML。没有必要。内置了更简单的方法。(参见下面的代码。)

对于示例代码,我将XML简化并硬编码为本地字符串,并且没有错误检查!该示例是基本的,但如果您了解XmlDocument.SelectNodes方法及其XPath表达式参数(示例/response/post将与您的响应XML一起使用),那么您可以在您选择的文档的任何级别重用它。无论你做什么,首先要想一想自己:&#34;有人之前已经做过这种操作并且可能有API吗?&#34; 99.9%的答案是

我还建议创建一个与您的XML文档匹配的数据类和一个List<YourDataClass>来包含实例。从您的代码示例中,您似乎正在尝试将数据项添加到单独的数组中。这是不必要的复杂和危险,因为将一个数组的数据链接到下一个数据的唯一数据是索引!请参阅底部添加的原始示例中的示例类结构。 (我保留了带有属性的XML值示例,以便轻松映射到XML文档。)

这是一个方便的教程,作为入门的基础,并探索了访问XML文档的其他方法:http://www.csharp-examples.net/xml-nodes-by-name/

private void ReadDoc()
{
    XmlDocument xml = new XmlDocument();
    xml.LoadXml(xmlString); // your test XML (hard coded below)

    XmlNodeList postList = xml.SelectNodes("/response/post");
    Console.WriteLine(postList.Count);
    foreach (XmlNode post in postList)
    {
        Console.WriteLine(post["from_id"]);
        Console.WriteLine(post["to_id"]);
        Console.WriteLine(post["date"]);
        Console.WriteLine(post["text"]);
    }
}

string xmlString = @"
<response list='true'>
    <count>12</count>
    <post>
        <id>307</id>
        <from_id>123</from_id>
        <to_id>123</to_id>
        <date>123892128</date>
        <post_type>post</post_type>
        <text>Smth TExt</text>
        <attachments list='true'>
            <attachment>
                <type>photo</type>
                <photo>
                    <pid>123</pid>
                    <aid>-7</aid>
                    <owner_id>123</owner_id>
                    <src>http://url1.jpg</src>
                    <src_big>http://url2.jpg</src_big>
                    <src_small>http://url3.jpg</src_small>
                    <src_xbig>http://url4.jpg</src_xbig>
                    <src_xxbig>http://url5.jpg</src_xxbig>
                    <src_xxxbig>http://url6.jpg</src_xxxbig>
                    <width>990</width>
                    <height>1188</height>
                    <text/>
                    <created>135</created>
                    <access_key>67</access_key>
                </photo>
            </attachment>
            <attachment>...</attachment>
            <attachment>...</attachment>
        </attachments>
        <comments><count>0</count></comments>
        <likes><count>2</count></likes>
        <reposts><count>0</count></reposts>
    </post>
</response>
";

示例数据类结构:

public class Post // <post>
{
    int PostId { get; set; } // <id>307</id>
    int FromId { get; set; } // <<from_id>123</from_id>
    int ToId { get; set; } // <<to_id>123</to_id>
    DateTime PostDate { get; set; } // <<date>123892128</date>
    string PostType { get; set; } // <<post_type>post</post_type>
    string Text { get; set; } // <<text>Smth TExt</text>
    List<PostAttachment> Attachments { get; set; } // <attachments list="true">
}

public class PostAttachment // <attachment>
{
  string AttachmentType { get; set; } // <type>photo</type>
  List<Photo> AttachedPhotos { get; set; } // <photo>
}

public class Photo 
{
    int PhotoId { get; set; } // <pid>123</pid>
    int AId { get; set; } // <aid>-7</aid>
    int OwnerId { get; set; } // <owner_id>123</owner_id>
    string Source { get; set; } // <src>http://url1.jpg</src>
    string Source1Small { get; set; } // <src_small>http://url3.jpg</src_small>
    string Source2Big { get; set; } // <src_big>http://url2.jpg</src_big>
    string Source3XBig { get; set; } // <src_xbig>http://url4.jpg</src_xbig>
    string Source4XXBig { get; set; } // <src_xxbig>http://url5.jpg</src_xxbig>
    string Source5XXXBig { get; set; } // <src_xxxbig>http://url6.jpg</src_xxxbig>
    int Width { get; set; } // <width>990</width>
    int Height { get; set; } // <height>1188</height>
    string Text { get; set; } // <text/>
    DateTime CreatedDate { get; set; } // <created>135</created>
    int AccessKey { get; set; } // <access_key>67</access_key>
}