2011-04-12 87 views
0
<Family_Inventory> 
    <FamilyCategory>Curtain Panels 
    <FamilyName>System Panel 
     <FamilySymbol>Glazed</FamilySymbol> 
     <FamilySymbol>Wall</FamilySymbol> 
    </FamilyName> 
    </FamilyCategory> 

    <FamilyCategory>Curtain Panels 
    <FamilyName>Rectangular Mullion 
     <FamilySymbol>2.5" x 5" rectangular</FamilySymbol> 
    </FamilyName> 
    </FamilyCategory> 
    ........... 
    ...........// many other family categories 
    ........... 

</Family_Inventory> 

我想创建一个基于它的价值只有一个FamilyCategory标签如上是“窗帘面板” 所以产量将如何编辑XML文件在C#

<Family_Inventory> 
    <FamilyCategory>Curtain Panels 
    <FamilyName>System Panel 
     <FamilySymbol>Glazed</FamilySymbol> 
     <FamilySymbol>Wall</FamilySymbol> 
    </FamilyName> 

    <FamilyName>Rectangular Mullion 
     <FamilySymbol>2.5" x 5" rectangular</FamilySymbol> 
    </FamilyName> 

    </FamilyCategory> 

    ........... 
    ...........// many other family categories 
    ........... 

</Family_Inventory> 

请告诉我,我可怎么办这个?。

由于提前 问候, 尼廷

+0

这个问题可能会帮助你http://stackoverflow.com/questions/331502/linq-to-xml-update-alter- -XML文件的节点 – Twelve47 2011-04-12 09:33:16

回答

0

你应该阅读XmlDocumentXmlNode的文件和它相关的类。还有很多关于如何在线使用它们的例子。

Here是一个XML与C#的介绍。

0

这使我想到的第一件事就是使用LINQ获得整份文件...然后就创建两个类

class FamilyCategory 
{ 
    string name; 
    List<FamilyName> familyNames; 
} 

class FamilyName 
{ 
    string name; 
    List<string> familySymbol; 
} 

您解析整个文档只是familyCategory对它们进行排序后..然后你只是通过列表。你创建一个FamilyCategory的新实例并将所有FamilyNames添加到它的列表中...对于每个新Cateogry你创建一个新类...之后你只需要将它们全部添加回来描述Here

+0

哦谢谢它的挑战性... – Nitin 2011-04-12 10:22:12

0

I'我没有测试过这个,但我认为它很接近。这是一种非常手动的方法,并且可能有一种更方便的方法,但只需将类别手动分组到一个名为groupedCategoryDocument的新xdocument中即可。

var doc = XDocument.Parse(xmlString); 
var groupedCategoryDocument = XDocument.Parse("<Family_Inventory />"); 


foreach(var category in doc.Root.Elements("FamilyCategory")) 
{ 
    //create the category for the new document 
    var groupedCategory = new XElement("FamilyCategory", category.Text); 

    //get all of the families for this category 
    foreach(var familyName in category.Elements("FamilyName")) 
    { 
    //add to new document 
    groupedCategory.Add(XElement.Parse(familyName.ToString()); 
    } 

    // add category to new document 
    groupedCategoryDocument.Add(groupedCategory); 
} 

在第三个预览,我想你想生成XML太复杂,我认为这将是最简单的无论是在代&消费方面

<Family_Inventory> 
    <Family category="{category-name}" name="{family-name}" symbol="{symbol-1}"/> 
    <Family category="{category-name}" name="{family-name}" symbol="{symbol-2}"/> 
    ... 
    <Family category="{category-name}" name="{family-name}" symbol="{symbol-n}"/> 
</Family_Inventory> 
0

一种可能性是使用XSLT和按键分组。在这种情况下,“类别”和“名称”使用混合内容会变得复杂;它使得关键结构不明显:

normalize-space(./node()[1]) FamilyCategory的第一个子节点被假定为包含类别名称的文本节点;它进一步修剪w.r.t.白色空间。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes" /> 

<xsl:key name="category" match="FamilyCategory" use="normalize-space(./node()[1])" /> 
<xsl:template match="Family_Inventory"> 
    <xsl:copy> 
     <xsl:for-each 
      select="FamilyCategory[count(. | key('category', normalize-space(./node()[1]))[1]) = 1]"> 
      <xsl:copy> 
       <xsl:value-of select="normalize-space(./node()[1])" /> 
       <xsl:for-each select="key('category', normalize-space(./node()[1]))/FamilyName"> 
        <xsl:copy-of select="."/> 
       </xsl:for-each> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

它是如何工作的一个很好的解释在这里找到:http://www.jenitennison.com/xslt/grouping/muenchian.xml