2011-04-20 1 views
3

학교에서 나에게 XML 문서를 주었고 그 정보를 화면에 표시해야합니다. 지금까지 내가 아는 한, XML 직렬화가 가장 쉽고/좋은 해결책 일 것입니다.C# XML 역 직렬화 오류 (2,2)

public static List<Project> ProjectListDeserialize(string path) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(List<Project>)); 
    Stream filestream = new FileStream(path, FileMode.Open); 
    return (List<Project>)serializer.Deserialize(filestream); 
} 

public static Projects ProjectsDeserialize(string path) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(Projects)); 
    Stream filestream = new FileStream(path, FileMode.Open); 
    return (Projects)serializer.Deserialize(filestream); 
} 

을 그리고이 같은 XML 문서 모습입니다 :

나는 지금까지이

<Projects xmlns='http://www.pulse.nl/DynamicsAX/2009/DataSets was not expected 

방법 :

<?xml version="1.0" encoding="utf-16" ?>  
<Projects xmlns="http://www.pulse.nl/DynamicsAX/2009/DataSets" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Project ID ="1000.0001" CustomerID="1000"> 
     <Name>Project data key performance indicators</Name> 
     <Status>WorkInProgress</Status> 
     <StartDate>2011-01-01</StartDate> 
     <ExpectedCompletionDate>2011-08-01</ExpectedCompletionDate> 
     <CompletionDate xsi:nil="true" /> 
    </Project> 
    <Project ID ="1000.0008" CustomerID="1000" ParentID="1000.0001"> 
     <Name>Implementation</Name> 
     <Status>WaitListed</Status> 
     <StartDate>2011-06-01</StartDate> 
     <ExpectedCompletionDate>2011-08-01</ExpectedCompletionDate> 
     <CompletionDate xsi:nil="true" /> 
    </Project> 
</Projects> 

두 가지 방법이 같은 예외를 던지고있다 위의 XML을 올바르게 deserialize 할 수 있습니까? 모든 샘플이 도움이 될 것입니다!

+0

당신은 프로젝트/s의 클래스 정의에 네임 스페이스를 정의 했습니까? – mmix

+0

Projects 요소에서 xmlns를 제거해야합니다. 또는 사용자 정의 직렬 변환기를 작성하십시오. 또는 .NET SDK의 xsd 도구를 사용하여 해당 Xml 형식과 호환되는 C# 클래스를 생성하십시오. –

답변

1

XmlSerializer의 생성자에서 XML 문서의 default namespace를 지정하십시오 :

var serializer = new XmlSerializer(typeof(Projects), "http://www.pulse.nl/DynamicsAX/2009/DataSets"); 

관련 리소스 :

또는, XmlTypeAttribute를 사용하여 적절한 네임 스페이스를 설정할 수 있습니다

+0

나는 주어진 답을 모두 결합하여이 문제를 해결할 수있었습니다. –

2

가장 일반적인 문제는 올바른 네임 스페이스를 Project 클래스의 특성으로 지정하지 않았기 때문입니다.

deserialization 중에 네임 스페이스를 무시하도록 XmlSerializer에 지시 할 수 있습니다 (this answer 확인).

[XmlType(Namespace = "http://www.pulse.nl/DynamicsAX/2009/DataSets")] 
public class Project 
{ 
    ... 
} 
+0

나는 주어진 대답을 모두 결합하여이 문제를 해결할 수있었습니다. –