Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C语言中编辑xml文件_C#_Xml - Fatal编程技术网

C# 如何在C语言中编辑xml文件

C# 如何在C语言中编辑xml文件,c#,xml,C#,Xml,我只希望基于其值创建一个FamilyCategory标记,如上所述为“窗帘嵌板” 因此,输出将是 <Family_Inventory> <FamilyCategory>Curtain Panels <FamilyName>System Panel <FamilySymbol>Glazed</FamilySymbol> <FamilySymbol>Wall</FamilySym

我只希望基于其值创建一个FamilyCategory标记,如上所述为“窗帘嵌板” 因此,输出将是

<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>
请告诉我怎么做

提前谢谢 当做
Nitin

您应该阅读和及其相关类的文档。关于如何在网上使用它们,也有很多例子


是对XML与C的介绍。

我想到的第一件事是使用linq获取整个文档。。。然后创建两个类

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

解析完整个文档后,只需按familyCategory对它们进行排序。。然后你只需浏览一下列表。创建FamilyCategory的新实例并将所有FamilyNames添加到其列表中。。。为每个新类别创建一个新类。。。在此之后,您只需将它们全部添加回去,如所述

我没有对此进行测试,但我认为已经接近了。这是一种非常手动的方法,可能有一种更灵活的方法,但它只是手动将类别分组到一个名为groupedCategoryDocument的新xdocument中

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

class FamilyName
{
    string name;
    List<string> familySymbol;
}
在第三次预览中,我认为您试图生成的XML太复杂了,我认为这在生成和使用方面都是最简单的

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);
}

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

规范化空间。/node[1]假定FamilyCategory的第一个子节点是包含类别名称的文本节点,;它是进一步修剪的w.r.t.空白

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

关于它的工作原理,可以在这里找到一个很好的解释:

这个问题可能会对您有所帮助
<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>