列表内列表

时间:2012-07-26 15:33:08

标签: c# xmldocument xmlnode

我知道它的代码很多......对不起......我的列表类就是这样......

public class XMLList
{
    public string Title { get; set; }
    [DataMember]
    public string Link { get; set; }
    [DataMember]
    public DateTime pubDate { get; set; }
    [DataMember]
    public string dcCreator { get; set; }
    [DataMember]
    public string GUID { get; set; }
    [DataMember]
    public Int32 wpPostId { get; set; }
    [DataMember]
    public string wpStatus { get; set; }
    [DataMember]
    public Int32 wpMenuOrd { get; set; }
    [DataMember]
    public string Category { get; set; }
    [DataMember]
    public List<Comment> Comments { get; set; }
}

public class Comment
{
    [DataMember]
    public Int32 wpCmtId { get; set; }
    [DataMember]
    public string wpCmtAuthor { get; set; }
    [DataMember]
    public string wpCmtAuthorEmail { get; set; }
    [DataMember]
    public string wpCmtAuthorURL { get; set; }
    [DataMember]
    public Int64 wpCmtAuthorIP { get; set; }
    [DataMember]
    public DateTime wpCmtAuthorDate { get; set; }
}

我的c#代码就像这样

XmlDocument doc = new XmlDocument();
doc.Load(@"xml\willowcreekassociationblog.wordpress.xml");
//Get Channel Node
XmlNode channelNode = doc.SelectSingleNode("rss/channel");
if (channelNode != null)
{
    //Add NameSpace
    XmlNamespaceManager nameSpace = new XmlNamespaceManager(doc.NameTable);
    nameSpace.AddNamespace("excerpt", "http://wordpress.org/export/1.2/excerpt/");
    nameSpace.AddNamespace("content", "http://purl.org/rss/1.0/modules/content/");
    nameSpace.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
    nameSpace.AddNamespace("wfw", "http://wellformedweb.org/CommentAPI/");
    nameSpace.AddNamespace("wp", "http://wordpress.org/export/1.2/");

    //Parse each item
    foreach (XmlNode itemNode in channelNode.SelectNodes("item"))
    {
        objrssItem.Add(rssItem);
        rssItem.GUID = itemNode.SelectSingleNode("guid").InnerText;
        rssItem.Title = itemNode.SelectSingleNode("title").InnerText;
        rssItem.dcCreator = itemNode.SelectSingleNode("dc:creator", nameSpace).InnerText;
        rssItem.Link = itemNode.SelectSingleNode("link").InnerText;
        rssItem.pubDate = DateTime.Parse(itemNode.SelectSingleNode("pubDate").InnerText);
        rssItem.ContentEncoded = itemNode.SelectSingleNode("content:encoded", nameSpace).InnerText;

        XmlNode cNode = doc.SelectSingleNode("rss/channel/item");
        foreach (XmlNode commentNode in cNode.SelectNodes("wp:comment", nameSpace))
        {
           //rssItem.Comments = Comments
            rsscomment.wpCmtId = Convert.ToInt32(commentNode.SelectSingleNode("wp:comment_id", nameSpace).InnerText);
            rsscomment.wpCmtAuthor = commentNode.SelectSingleNode("wp:comment_author", nameSpace).InnerText;
            rsscomment.wpCmtContent = commentNode.SelectSingleNode("wp:comment_content", nameSpace).InnerText;  
        }
    }
    oXMLListResult.listOfXMLResult = objrssItem;
}

我有像enter link description here

这样的xml

当我尝试使用xmlnode读取通道中的每个项目并且其工作正常时。并且每个项目都有多个注释,试图通过在foreach中使用foreach来实现。但是wp:评论foreach项目不起作用。我究竟做错了什么?我做了一些谷歌,但没有运气。

感谢。

1 个答案:

答案 0 :(得分:1)

XmlNode cNode = doc.SelectSingleNode("rss/channel/item");

这会将您的item枚举重置为开头,这会导致每个项目都有相同的注释。

编辑:
我相信这是解决我提到的问题最简单的方法。通过在已选择的节点下搜索,可以避免重复。请注意,不再需要cNode

foreach (XmlNode commentNode in itemNode.SelectNodes("wp:comment", nameSpace))