【问题标题】:how to edit xml file in C#如何在C#中编辑xml文件
【发布时间】:2011-04-12 09:19:43
【问题描述】:
<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>

请告诉我该怎么做?

提前致谢 问候, 尼丁

【问题讨论】:

标签: c# xml


【解决方案1】:

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

Here 是用 C# 介绍 XML。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我没有对此进行测试,但我认为它很接近。这是一种非常手动的方法,可能有一种更巧妙的方法,但它只是手动将类别分组到一个名为 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>
      

      【讨论】:

        【解决方案4】:

        一种可能性是使用 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

        【讨论】:

          猜你喜欢
          • 2018-01-01
          • 1970-01-01
          • 2011-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多