我有这个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;
}
答案 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>
}