如何在C#中编辑xml文件

时间:2011-04-12 09:19:43

标签: c# xml

<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>

请告诉我怎么能这样做?。

先谢谢 问候, 尼丁

4 个答案:

答案 0 :(得分:0)

您应该阅读有关XmlDocumentXmlNode及其相关课程的文档。还有很多关于如何在线使用它们的例子。

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