<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标记,如上所述'Curtain Panels' 所以输出将是
<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 :(得分:0)
您应该阅读有关XmlDocument和XmlNode及其相关课程的文档。还有很多关于如何在线使用它们的例子。
Here是对C#的XML介绍。
答案 1 :(得分:0)
我想到的第一件事是使用linq获取整个文档......然后只创建两个类
class FamilyCategory
{
string name;
List<FamilyName> familyNames;
}
class FamilyName
{
string name;
List<string> familySymbol;
}
解析完整个文档后,只需按familyCategory对它们进行排序..然后你就可以浏览一下了。您创建一个FamilyCategory的新实例并将所有FamilyNames添加到其列表中...对于每个新的Cateogry,您创建一个新类...之后您只需要将它们全部添加回来,这将描述为Here
答案 2 :(得分:0)
我没有测试过这个,但我认为它很接近。这是一种非常手动的方法,可能有一种更为流畅的方法,但它只是手动将类别分组到一个名为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>
答案 3 :(得分: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