2014-03-05 1 views
0

XML을 구조화하기 위해 SQLite 데이터베이스를 내 보낸 다음 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" 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> 

가 지금은

<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과 같은 몇 가지 열을 유지할 필요가 다음 것처럼

<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을 다음과 같았다

아무도 나에게 그걸 어떻게 할 수있는 힌트를 줄 수 있습니까? 구조화 된 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);