如何通过Foreach绑定XAttribute Value

时间:2012-07-25 15:27:28

标签: xml linq c#-4.0 linq-to-xml

var xEle = new XElement("ContentDetails",
            from emp in _lstContents
            select new XElement("Contents",
                        new XAttribute("key", emp.Key),
                        new XAttribute("PublishedDate", emp.PublishedDate),
                        new XAttribute("FilePathURL", emp.FilePathURL),
                        new XAttribute("ID", emp.TitleID),
                        new XAttribute("ContentName", emp.Name)
                        ));

_lstContents包含整个记录。我需要通过LinQ操作构建XmlDocument 我知道它可以实现,我做到了。 这是我的样本XML,我已经这样做了:

<ContentDetails>
  <Contents ContentName="Sample Project Plan SOW" ID="3"
        FilePathURL="http://192.168.30.59/contentraven/Uploads/Custom_View_LLC/EncryptedFile/zsg34g45tfblrkvzjh0cdlvs_17_7_2012_19_24_3.doc"
        PublishedDate="2012-07-10T14:37:02.073" key="310-072012-A5CDE"/>
</ContentDetails>

但现在我需要的是

<ContentDetails>
  <Contents ContentName="Sample Project Plan SOW" ID="3"
        FilePathURL="http://192.168.30.59/contentraven/Uploads/Custom_View_LLC/EncryptedFile/zsg34g45tfblrkvzjh0cdlvs_17_7_2012_19_24_3.doc"
        PublishedDate="2012-07-10T14:37:02.073" key="310-072012-A5CDE"/>
   <categories>
      <category id="1" categoryname="Category-1" contentid="3"/>
      <category id="2" categoryname="Category-2" contentid="3"/>
      <category id="3" categoryname="Category-3" contentid="3"/>
  </categories>
</ContentDetails>

我正在尝试这样的事情

var xEle = new XElement("ContentDetails",
            from emp in _lstContents
            select new XElement("Contents",
                        new XAttribute("key", emp.Key),
                        new XAttribute("PublishedDate", emp.PublishedDate),
                        new XAttribute("FilePathURL", emp.FilePathURL),
                        new XAttribute("ID", emp.TitleID),
                        new XAttribute("ContentName", emp.Name),
                            new XElement("Categories",
                                new XElement("Category",
                                    new XAttribute("ID", emp.Category.ForEach(_P => _P.CategoryID ),
                                    new XAttribute("CategoryName", emp.Category.ForEach(_P => _P.CategoryName))
                                )

                        ));

我怎么能实现这个目标?

emp.Category是_lstContents列表中的属性列表;

我需要在emp.Category中创建很多CategoryName属性。

请参阅随附的屏幕截图。 谢谢

enter image description here

1 个答案:

答案 0 :(得分:2)

你几乎就在那里,你只需要将类别集中的项目投射到category个元素。与您在_lstContentsContents元素中投影项目的方式没有太大区别。

var contentDetails =
    new XElement("ContentDetails",
        from contents in _lstContents
        select new XElement("Contents",
            new XAttribute("ContentName", contents.Name),
            new XAttribute("ID", contents.TitleID),
            new XAttribute("FilePathURL", contents.FilePathURL),
            new XAttribute("PublishedDate", contents.PublishedDate),
            new XAttribute("key", contents.Key),
            new XElement("categories",
                from category in contents.Category
                select new XElement("category",
                    new XAttribute("id", category.CategoryID),
                    new XAttribute("categoryname", category.CategoryName),
                    new XAttribute("contentid", category.ContentID)
                )
            )
        )
    );