2011-01-24 2 views
0

나는 클라이언트로부터 XML을 받아들이는 소프트웨어를 작성 중이다. 는 XML HAS2 부품, 세트 필드를 포함하는 표준 부품, 그리고 우리의 고객이 시스템은되도록 설정되어vb.net에서 XML 네임 스페이스 참조 추가

<OverallDocument> 
    <SetFields> 
     <name>Jon Doe</name> 
     <age>24</age> 
     <sex>M</sex> 
    </SetFields> 
    <FreeXML> 
    <!--custom xml goes here--> 
    </FreeXML> 
</OverallDocument> 

자신의 XML을 직접 추가 할 수있는 자유 부분 OverallDocument는 모든 부분을 커버하는 스키마를 가지고 Free XML 태그 안에 들어가는 것을 제외하고 xml의 FreeXML 태그의 내용에는 클라이언트가 보낸 자체 스키마가 있습니다. 이

<Custom1> 
    <CustomString>aaaaaa</CustomString> 
    <CustomInt>12345</CustomInt> 
</Custom1> 

프로그램은 추가 처리를 위해 클라이언트의 사용자 지정 XML을 추출하기 위해 노력하고있다처럼

<OverallDocument> 
    <SetFields> 
     <name>Jane Doe</name> 
     <age>30</age> 
     <sex>F</sex> 
    </SetFields> 
    <FreeXML> 
    <Custom1> 
     <CustomString>aaaaaa</CustomString> 
     <CustomInt>12345</CustomInt> 
    </Custom1> 
    </FreeXML> 
</OverallDocument> 

이 경우 클라이언트의 XML 보인다.

지금까지 문제가 없습니다. 이 모든 것은 xmldocument로 멋지게 읽습니다. 불행히도 일부 고객은 xml 문서의 접두사를 선언하지 않고도 사용자 지정 xml에 네임 스페이스 접두사를 사용합니다.

<OverallDocument> 
    <SetFields> 
     <name>Jane Doe</name> 
     <age>30</age> 
     <sex>F</sex> 
    </SetFields> 
    <FreeXML> 
    <hl:Custom1> 
     <CustomString>aaaaaa</CustomString> 
     <CustomInt>12345</CustomInt> 
    </hl:Custom1> 
    </FreeXML> 
</OverallDocument> 

이렇게하면 접두어가 xml에 선언되지 않아 xmldocument가 넘어갑니다. 코드에서 모든 네임 스페이스 접두사를 제거하여이 문제를 해결하기 위해 노력했지만 클라이언트의 스키마에서 접두사를 태그에 사용해야하므로 처리 과정에서 나중에 문제가 발생합니다.

몇 가지 더 문제가

  • 우리는 다른 스키마와 다른 네임 스페이스에 많은 클라이언트가 있습니다.
  • 각 XML 파일은 다른 섹션에서 여러 FreeXML 요소를 가질 수 있습니다 (그래서 다른 클라이언트가 문서 전반에 걸쳐 서로 다른 위치 1 이상 사용 섹션을 사용할 때 단순히 FreeXML 섹션을 추출 수 없습니다.
  • 우리는 고객의 스키마를 편집 할 수 없습니다.
  • 우리는 작업 XML을 자신의 행동을 정렬하고 작성하는 고객을 말할 수 없다. 이상적으로 그것을

네임 스페이스와 접두어를 xmldocument 리더에 지정할 수 있다면 가장 좋을 것입니다. 그것은이 문제를 해결하는 방법을 보인다 예를 들어

dim xdoc as xmldocument = xmldocument 
'add namespace and prefix 
xdoc.loadxml(xmlcode) 

답변

0

은 XML이 XMLDocument로에로드되는 방식을 변경하는 것입니다. 이전에 xmldocument의 loadxml 메서드로 문자열을 파싱 했었습니다. 이제 stringreader로 문자열을 파싱 한 다음 stringreader를 xmltextreader로 파싱합니다. xmltextreader에는 네임 스페이스 유효성 검사를 해제 할 수있는 네임 스페이스 속성이 있습니다. 그러면 xmltextreader를 xmldocument의 load 메서드로 파싱 할 수 있습니다.

Dim xstring As String = xmldata 
Dim sreader As New System.IO.StringReader(xstring) 'load string into stringreader 
Dim xreader As New XmlTextReader(sreader)   'load stringreader into xmltextreader 
xreader.Namespaces = False       'turn off namespaces 
Dim xdoc As XmlDocument = New XmlDocument   'create xmldocument 
xdoc.Load(xreader)         'Load xmltextreader into xmldocument