簡體   English   中英

如何在C#中編輯xml文件

[英]how to edit xml file in C#

<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標簽,因為上面是“窗簾面板”,因此輸出將是

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

請告訴我我該怎么做?

提前致謝,尼丁

您應該閱讀XmlDocumentXmlNode及其相關類的文檔。 還有許多如何在線使用它們的示例。

是使用C#進行XML的介紹。

我想到的第一件事是使用linq來獲取整個文檔...然后只創建兩個類

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

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

解析整個文檔后,只需按familyCategory對它們進行排序即可。然后,您只需遍歷列表即可。 創建FamilyCategory的新實例,所有的FamilyNames添加到其列表...對於每一個新Cateogry您創建一個新類... ...之后,你只需要添加他們被描述都回來這里

我尚未對此進行測試,但我認為它已經接近。 這是一種非常手動的方法,可能有一種更輕松的方法,但這只是將類別手動分組到一個名為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>

一種可能性是使用XSLT並按鍵分組。 在這種情況下,由於將混合內容用於“類別”和“名稱”而變得很復雜; 它使密鑰構造變得不明顯:

normalize-space(./node()[1])假定FamilyCategory的第一個子節點是一個包含類別名稱的文本節點; 它會進一步修剪白色空間。

<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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM