2011-01-24 22 views
0

私はクライアントからXMLを受け入れるソフトウェアを書いています。 OverallDocumentはすべてのセクションをカバーしてスキーマを持つようにシステムが設定されている のxml HAS2パーツ、セットのフィールドを含む標準部品、および当社の顧客は、自分のXMLを独自に追加することを可能にする自由形式の一部vb.netでXML名前空間の参照を追加する

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

Free XMLタグの中に入るものを除いてxmlの FreeXMLタグの内容には、クライアントが私たちに送信した独自のスキーマがあります。

<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は、この

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

のように見えます。この場合、プログラムは、更なる処理のために、クライアントのカスタム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 
関連する問題