2014-12-09 4 views
3

때때로받는 XML의 네임 스페이스를 변경하는 API를 다루고 있습니다. XML 구조는 동일하게 유지됩니다. 강력한 형식의 모델로 XML을 deserialize해야합니다.네임 스페이스를 모르는 경우 어떻게 XML을 deserialize합니까?

XML의 네임 스페이스에 관계없이 역 직렬화를 수행하려면 어떻게해야합니까?

나는이 같은 모델을 사용 하였다

[Serializable, XmlRoot(ElementName = "TestModel", Namespace = "http://schemas.datacontract.org/UnknownNamespace1")] 
public class TestModel 
{ 
    public TestModel() 
    { 
     TestElements = new List<TestModelChildren>(); 
    } 

    [XmlElement("TestModelChildren")] 
    public List<TestModelChildren> TestElements { get; set; } 
} 

나는 다음과 같은 코드로 해당 모델에 약간의 XML을 역 직렬화 할 :

public TestModel DeserializeIt(XDocument xDoc) 
{ 
    TestModel result; 
    var serializer = new XmlSerializer(typeof(TestModel)); 

    using(var sr = new StringReader(xDoc.ToString())) 
    { 
     result = (TestModel)serializer.Deserialize(sr); 
    } 

    return result; 
} 

내 문제를 그 모든 너무 자주, 네임 스페이스 XML에서 나는 변화를 받고있다. 다음과 같이 XML을 시작할 수 있습니다.

<TestModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/UnknownNamespace2"> 
    <TestModelChildren> 
     ... 
    </TestModelChildren> 
</TestModel> 

이 네임 스페이스 변경이 발생할 때마다 코드를 다시 컴파일하지 않으려 고합니다. 어떻게 처리할까요?

답변

3

XmlSerializer에 네임 스페이스를 기본 네임 스페이스로 전달하여 문제를 해결할 수있었습니다. XDocument에서 네임 스페이스를 빼내서이 작업을 수행 할 수 있습니다.

내 새로운 모델은 지정된 네임 스페이스없이 같을 것이다 :

[Serializable, XmlRoot(ElementName = "TestModel")] 
public class TestModel 
{ 
    public TestModel() 
    { 
     TestElements = new List<TestModelChildren>(); 
    } 

    [XmlElement("TestModelChildren")] 
    public List<TestModelChildren> TestElements { get; set; } 
} 

내 코드를 XML이 같을 것이다 직렬화 복원이 나를 위해 일하고있다

public TestModel DeserializeIt(XDocument xDoc) 
{ 
    TestModel result; 
    var serializer = new XmlSerializer(typeof(TestModel), xDoc.Root.Name.Namespace.ToString()); 

    using(var sr = new StringReader(xDoc.ToString())) 
    { 
     result = (TestModel)serializer.Deserialize(sr); 
    } 

    return result; 
} 

.

관련 문제