2016-06-23 2 views
0

텍스트 파일에서 가져온 다음 XML 문자열의 "U8"노드에서 정보 (Name 및 Val)를 얻고 싶습니다.XML serializing returns null

<Cluster> 
    <String> 
     <Name>SomeNAme</Name> 
     <Val> 
      &lt;Cluster&gt; 
       &lt;Name&gt;SomeNAme&lt;/Name&gt; 
       &lt;NumElts&gt;2&lt;/NumElts&gt; 
       &lt;U8&gt; 
        &lt;Name&gt;SomeNAme&lt;/Name&gt; 
        &lt;Val&gt;11&lt;/Val&gt; 
       &lt;/U8&gt; 
       &lt;U8&gt; 
        &lt;Name&gt;SomeNAme&lt;/Name&gt; 
        &lt;Val&gt;208&lt;/Val&gt; 
       &lt;/U8&gt; 
      &lt;/Cluster&gt; 
     </Val> 
    </String> 
</Cluster> 

나는 다음 정보를 얻기 위해 U8 노드에 속하지만 출력은 Null을 반환한다고 썼다. 나는 무엇을 잘못 했는가? 감사합니다

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml.Serialization; 
using System.IO; 
using System.Xml.Linq; 
using System.Xml; 
namespace testXMLSerializer 
{ 
    class Class4 
    { 
     static void Main(string[] args) 
     { 
      var xml = File.ReadAllText(@"C:\test.xml"); 

      XmlSerializer serializer = new XmlSerializer(typeof(Cluster)); 

      using (var reader = new StringReader(xml)) 
      { 
       var info = (Cluster)serializer.Deserialize(reader); 
      } 

      Console.Read(); 
     } 
    } 

    [XmlRoot("Cluster")] 
    public class Cluster 
    { 
     [XmlElement("String")] 
     public List<Cluster_String> Cluster_String { get; set; } // I'll have many of this items in the actual xml 
    } 

    public class Cluster_String 
    { 
     [XmlElement("Val")] 
     public Val Val { get; set; } 
    } 

    public class Val 
    { 
     [XmlElement("Cluster")] 
     public Cluster_S_V_Cluster Cluster_S_V_Cluster { get; set; } 
    } 

    public class Cluster_S_V_Cluster 
    { 
     [XmlElement("U8")] 
     public List<U8> U8 { get; set; } 
    } 

    public class U8 
    { 
     public string Name { get; set; } 
     public string Val { get; set; } 
    } 
} 

답변

0

문제는 내부 클러스터 노드가 인코딩된다는 것입니다. 당신이 (파일을 저장할 때) 처음에 그 파일 디코딩이 어차피 경우, 단지 추가 :

xml = System.Net.WebUtility.HtmlDecode(xml); 

후 :

var xml = File.ReadAllText(@"C:\test.xml"); 

당신이처럼 보이는 결국해야 주 :

static void Main(string[] args) 
    { 
     var xml = File.ReadAllText(@"test.xml"); 
     xml = System.Net.WebUtility.HtmlDecode(xml); 
     XmlSerializer serializer = new XmlSerializer(typeof(Cluster)); 

     using (var reader = new StringReader(xml)) 
     { 
      var info = (Cluster)serializer.Deserialize(reader); 
     } 

     Console.Read(); 
    } 
+0

내가 선 "VAR 정보 = ..."에 "잘못된 연산 예외"를 가지고 오류는 다음과 같습니다 미는 System.Xml.dll에서 'System.InvalidOperationException'유형의 예외를 처리했습니다. – CB4

+0

이 여러 번 시도했습니다. 내가 게시 한 코드가 작동해야합니다. "HtmlDecode"이후에 어떤 결과가 발생합니까? 디버거에서 XML을 보길 원한다면 유효한 XML을 얻겠습니까? 원본 XML 파일을 게시 할 수 있습니까? 전체 예외 (내부 예외)? –

+0

내 XML 텍스트 파일이 큰 파일입니다. 그것은 여전히 ​​XML 인코딩 된 위의 부분을 제외하고 모든 XML을 디코딩했습니다. 귀하의 질문에, HtmlDecoder 직후에 XML 문자열에 "XML 페이지를 표시 할 수 없습니다. XSL 스타일 시트를 사용하여 XML 입력을 볼 수 없습니다. 오류를 수정 한 후 새로 고침 버튼을 클릭하거나 나중에 다시 시도하십시오. . ---------------------------------------------- ---------------------------------- 공백은이 위치에서 허용되지 않습니다. 리소스 파일 처리 중 오류가 발생했습니다. " – CB4