2011-10-11 5 views
2

I는 다음과 같습니다 테스트 XML 파일이있어 :xml 네임 스페이스를 무시하는 방법?

내가 역 직렬화하기 위해 노력하고있어
<Person> 
    <ContactInfo> 
    ... 
    <ContactInfo> 
</Person> 

, 모든 것이 잘 작동합니다. 하지만 문제는 때때로이 xml 파일의 구조가 다른 것입니다. xml 네임 스페이스가 때때로 추가됩니다.

<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 
    <ContactInfo> 
    ... 
    <ContactInfo> 
</Person> 

그리고 지금은 직렬화있을 때, 나는 IOnvalidOperationException를 얻을 : "XML 문서에 오류가 있습니다 (1, 2)." 내부 예외 메시지에 <Person xmlns='http://tempuri.org/PaymentInformationXml.xsd'>이 필요하지 않다고 나와 있습니다.

아무도 도와 줄 수 있습니까?

+0

무엇을 역 직렬화에 사용하고 있습니까? –

+0

예제 XML과 오류 메시지가 일치하지 않습니다. xsi/xsd는 단지 네임 스페이스 별칭 일 뿐이며 아무 것도 변경하지 않습니다. 꽤 많이 무시할 수 있습니다. 그러나'xmlns = '... blah ...'는 ** 매우 중요합니다 **. 제발 명확히 : 귀하의 XML이 아닌가요? 그렇다면 XmlSerializer에 미리 알려야합니다. –

답변

4

네임 스페이스는 XML에서 기본 요소입니다 (상호 교환이 가능한 네임 스페이스와 달리). 사람이 해당 네임 스페이스에있는 경우, 당신은 그것을 알려야합니다 : XML에 대한 기사가있다

[XmlRoot(Namespace="http://tempuri.org/PaymentInformationXml.xsd")] 
public class Person {...} 
0

XmlSerializerNamespaces을 확인하십시오.

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("xsd", "http://www.w3.org/2001/XMLSchema"); 
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
는 XmlSerializer를 직접 수행 할 수있는 기본 네임 스페이스 제어

:

XmlSerializer xs = new XmlSerializer(typeof(Person), "http://tempuri.org/PaymentInformationXml.xsd"); 

을 ...하지만 문제는 문제의 출처에 대해 조금 불분명하다.

Person 클래스 [XmlType] 속성을 확인하십시오 : 당신의 Person 유형에 대한

[XmlType(Namespace="http://tempuri.org/PaymentInformationXml.xsd")] 
public class Person 
{ 
    //... 
} 

네임 스페이스는 직렬화 할 때 사용하는 하나와 일치해야합니다.

+0

문제는 xsi/xsd가 아니라 xmlns =이므로 XmlSerializerNamespaces는 여기에서 아무 것도하지 않는다는 것을 의미합니다. –

0

here

그리고 나는 또한이 코드 조각 accros 발견 : (매우 helpfull)

XmlDocument stripDocumentNamespace(XmlDocument oldDom) 
{ 
// Remove all xmlns:* instances from the passed XmlDocument 
// to simplify our xpath expressions. 
XmlDocument newDom = new XmlDocument(); 
newDom.LoadXml(System.Text.RegularExpressions.Regex.Replace(
oldDom.OuterXml, @"(xmlns:?[^=]*=[""][^""]*[""])", "", 
System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline) 
); 
return newDom; 
} 

이것이 도움이 되었기를 바랍니다

관련 문제