2014-03-05 143 views
0

我已經導出了一個SQLite數據庫來構造XML,然後使用c#.net中的以下代碼將其轉換爲平面XML。將結構XML轉換爲平面XML,但某些列除外

XDocument Doc = XDocument.Load("myXML.xml"); 
      XElement[] elements = Doc.DescendantNodes() 
       .Where(n => n.NodeType == XmlNodeType.Text).Select(n => n.Parent).ToArray(); 

      foreach (XElement element in elements) 
      { 
       element.Parent.SetAttributeValue(element.Name, element.Value); 
       element.Remove(); 
      } 

結構XML像下面

<apple> 
     <id>1</id> 
     <name>Apple 1</name> 
     <orange> 
     <id>5</id> 
     <orangeNmae>C1</orangeNmae> 
     <function>good for health</function> 
     <part>7</part> 
     <banana> 
      <id>9</id> 
      <bananaName>48</bananaName> 
      <effect>23</effect>   
      <notes>be careful</notes> 
     </banana> 
     <banana> 
      <id>10</id> 
      <bananaName>49</bananaName> 
      <effect>24</effect>   
      <notes>be careful!</notes>   
     </banana> 
     </orange> 
</apple> 

產生的扁平XML是像下面

<apple id="1" name="Apple 1"> 
     <orange id="5" orangeNmae="C1" function="good for health" part="7">   
     <banana id="9" bananaName="48" effect="23" notes="be careful" /> 
     <banana id="10" bananaName="49" effect="24" notes="be careful" />   
     </orange> 
</apple> 

現在我需要保持像結構化的XML一些列像下面

<apple id="1" name="Apple 1"> 
     <orange id="5" orangeNmae="C1" function="good for health" part="7">   
     <banana id="9" bananaName="48" />    
      <notes>be careful</notes> 
      <effect>23</effect> 
     <banana id="10" bananaName="49" />     
      <notes>be careful</notes> 
      <effect>23</effect>  
     </orange> 
</apple> 

任何人都可以給我任何提示如何做到這一點? 在將結構化XML轉換爲平面XML時,我應該改變方法嗎?

+0

豈不XSLT轉換是一個更適合這個? – rene

+0

你能給我舉個例子嗎? – rzmuc

+0

有什麼辦法可以跳過一些從轉換到平面xml的列嗎? – rzmuc

回答

0

此XSLT爲您做了轉換。我使用模板來匹配元素,並使用XSLT處理器的模式功能首先處理轉換爲屬性,然後處理其他元素。

<!-- elements to be transformed to attributes --> 
    <xsl:template match="*[not(text()[normalize-space()])]"> 
    <xsl:element name="{name()}"> 
     <xsl:apply-templates mode="attr"/> 
     <xsl:apply-templates /> 
    </xsl:element> 
    </xsl:template> 

    <!-- copy elements not handled as attribute --> 
    <xsl:template match="effect|notes"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

    <!-- create attributes excluding certain elements --> 
    <xsl:template match="*[text()[normalize-space()] and not(self::effect | self::notes)]" mode="attr"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="./text()"/> 
    </xsl:attribute> 
    </xsl:template> 

    <!-- surpress defaults --> 
    <xsl:template match="text()"> 
    </xsl:template> 
    <xsl:template match="*|text()" mode="attr"> 
    </xsl:template> 

這裏是你如何能利用是:

 var xct = new XslCompiledTransform(); 
     xct.Load(XmlReader.Create("transform.xslt")); 
     var xw = XmlWriter.Create("output.xml")); 
     xct.Transform(
      XmlReader.Create("input.xml"), 
      xw); 
相關問題