2014-01-05 2 views
0

다음 XML 구조가 있습니다.C에서 태그 내의 속성을 사용하여 XML 생성 #

<a> 
    <b> 
    <c> 
     <d>54</d> 
     <e>US</e> 
     <f>Canada</f>   
     <g> 
     <h> 
      <i1>39</i1>    
      <i2>Belgium</i2> 
      <i3>Russia</i3> 
     </h> 
     <h> 
      <i1>43</i1>    
      <i2>Fran</i2> 
      <i3>Ger</i3> 
     </h> 
     </g> 
    </c> 
    <c> 
     <d>5</d> 
     <e>US</e> 
     <f>Can</f>   
     <g> 
     <h> 
      <i1>29</i1>    
      <i2>Brit</i2> 
      <i3>Ice</i3> 
     </h> 
     <h> 
      <i1>95</i1>    
      <i2>Russia</i2> 
      <i3>Nero</i3> 
     </h> 
     <h> 
      <i1>4323</i1>    
      <i2>Polska</i2> 
      <i3>503</i3> 
     </h> 
     </g> 
    </c>   
    </b> 
    <b2> 
    <c2> 
     <d2>551</d2> 
     <d3>Indo</d3> 
     <e2> 
     <f2> 
      <g2>Irnna</g2> 
      <g3>Mehak</g3> 
      <g4>Vodka</g4>    
      <h2> 
      <i2> 
       <j1>44</j1>     
       <j6>Germ0</j6>     
      </i2> 
      <i21>Finish</i21> 
     </f2>  
     </e2> 
     <f3>544</f3> 
     <g3>fur</g3> 
     <h3>denmark</h3> 
    <k1>lur</k1> 
    <k2>Bern</k2> 
    <k3>Zurick</k3> 
    <k4>Italy</k4> 
    </c2> 
    </b2> 
<b3>35</b3> 
<b4>ferha</b4> 
<b5>english</b5> 
<b6>334</b6> 
</a> 

나는 태그 내의 모든 속성을 넣어 의미 다음과 같은 -

<a> 
     <b> 
     <c d="54"; e="US"; f="Canada">   
     <g> 
      <h i1="39"; i2 = "Belgium"; i3 ="Russia">    
      <h i1="393"; i2 = "Fran"; i3 ="Ger">     
     </g> 
     </c> 
     <c> 
     . 
     . 
    . 
    . 

처럼 변환해야합니다. 나는 다음 C# 코드를 사용했다 .-

var xDoc = XDocument.Load("my.xml"); 
       var xNode = 
        new XElement("a", 
         from name in xDoc.Root.Elements() 
         select new XElement(name.Name, 
          from names in name.Elements() 
          select new XElement(names.Name, 
           from namesElement in names.Elements() 
           where namesElement.Name.LocalName != "g" 
           select new XAttribute(namesElement.Name.LocalName, (string)namesElement), 
           new XElement("g", 
            from Parts in names.Element("g").Elements() 
            select new XElement(Parts.Name, 
             from routeElement in Parts.Elements() 
             select new XAttribute(routeElement.Name.LocalName, (string)routeElement)))))); 

그러나 나는 오류가 발생한다. 제 코드에 무엇이 잘못 되었습니까? 힌트를 주시겠습니까? 실제로, 그것은 (상반기까지) 작동합니다. 후반부에 구조가 바뀌면 "객체 참조가 객체의 인스턴스로 설정되지 않았습니다.", "중복 속성"과 같은 오류가 표시됩니다. 제 접근 방식이 맞는지 아닌지 제발 알려주시겠습니까? 논리 구조에 문제가 있습니까?

+0

XSLT를 통해 더 잘 처리 될 것이라고 생각합니다. – Tim

+0

제 구조에 맞는 샘플을 좀주세요. – Imha

+0

불행히도 그걸 알아내는 데 걸리는 시간보다 더 빠를 수는 없습니다. 10 년 전 펜으로 냅킨에 상당히 복잡한 XSLT를 할 수 있었지만 그 이후로는 사용하지 않았습니다. :/ – Tim

답변

0

샘플 입력 XML 문서에 h2 요소의 닫기 태그가 없습니다. 또한 입력 XML. 서의 값이 예상 출력 XML의 값과 일치하지 않습니다. 말했다되는 것을 나는 당신의 샘플 입력을 사용 (I 누락 ​​H2 닫는 태그를 추가)하고 다음 코드를 통해 실행 :

XDocument xDoc = XDocument.Load("my.xml"); 
XElement[] elements = xDoc.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(); 
} 

그리고 결과 출력이이었다

<a b3="35" b4="ferha" b5="english" b6="334"> 
    <b> 
    <c d="54" e="US" f="Canada"> 
     <g> 
     <h i1="39" i2="Belgium" i3="Russia" /> 
     <h i1="43" i2="Fran" i3="Ger" /> 
     </g> 
    </c> 
    <c d="5" e="US" f="Can"> 
     <g> 
     <h i1="29" i2="Brit" i3="Ice" /> 
     <h i1="95" i2="Russia" i3="Nero" /> 
     <h i1="4323" i2="Polska" i3="503" /> 
     </g> 
    </c> 
    </b> 
    <b2> 
    <c2 d2="551" d3="Indo" f3="544" g3="fur" h3="denmark" k1="lur" k2="Bern" k3="Zurick" k4="Italy"> 
     <e2> 
     <f2 g2="Irnna" g3="Mehak" g4="Vodka"> 
      <h2 i21="Finish"> 
      <i2 j1="44" j6="Germ0" /> 
      </h2> 
     </f2> 
     </e2> 
    </c2> 
    </b2> 
</a> 

것 같아 어느 당신이 찾고 있던 것이지만, 아마 코드가 올바른 방향으로 당신을 가리킬 수 있습니다.

사용중인 쿼리 구문 대신 LINQ 메서드 구문을 사용했지만 그 부분이 중요하다고 생각하지 않습니다. 그러나 "a"나 "g"와 같은 특정 요소를 찾고 있음을 알았습니다. 좀 더 일반적인 방법으로이를 수행 할 수 있는지 알고 싶었습니다.

나는 이것을 작성하면서 null 참조 예외도 만났다. 예를 들어, 원래는 elements이라는 변수를 IEnumerable<XElement>으로 가지고 있었지만, 나중에 foreach에있는 부모로부터 요소를 제거하고, 다음 반복에서 일부 LINQ 지연 실행이 있으므로 DescendantNodes()으로 돌아갈 것이지만, 요소가 제거 된 상태로 T 작업을 수행하면 null 참조 예외가 표시됩니다. 따라서 LINQ 아래에서 일을 변경하는 대신 컬렉션 ToArray()을 사용하여 모든 실행이 즉시 수행되도록하고 대신 배열을 사용합니다. 아마 이런 일이 너에게도 일어나기 때문에 나는이 모든 것을 언급한다.

+0

그것은 작동합니다! 고마워요 :) – Imha

+0

어쨌든,이 XML 형식을 데이터베이스로 변환 할 수 있습니까? 너는 어떤 생각이있어? – Imha

+0

@Imha 환영합니다. 나는 당신이 "이 xml 형식을 데이터베이스로 변환하는 것이 가능하다"라고 말할 때 어떤 질문을하는지 정확히 모르겠다. 나는 여러 가지 중 하나를 의미 할 수있다. 그러나 대답은 "예"라고 추측한다. 나는 당신이 무엇을하려고하는지에 대한 충분한 세부 사항과 물론 당신이 이미 시도한 것을 포함하여 새로운 질문에 이것을 묻는 것이 좋을 것입니다. 그렇게하면 우리는 모두 같은 페이지에 있으며 솔루션을 향해 함께 작업 할 수 있습니다. – erli

관련 문제