2011-01-24 74 views
0

我正在寫一個接受來自我們客戶的XML的軟件。 的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> 

,系統默認設置,以便OverallDocument具有覆蓋所有部門架構除了FreeXML標籤內部的內容之外。 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> 

這會導致xmldocument崩潰,因爲前綴未在xml中聲明。我嘗試通過從代碼中刪除所有名稱空間前綴來解決此問題,但由於客戶端的模式需要前綴位於標記中,因此這會在處理中稍後導致問題。

一些進一步的問題

  • 我們有不同的 模式和不同的命名空間的許多客戶。
  • 每個XML文件可以在不同的 部分多 FreeXML元素(所以它不可能 作爲 不同客戶在整個文檔中的不同位置 使用1或更多, 使用部分簡單的提取FreeXML部分。
  • 我們不能修改客戶端的架構。
  • 我們不能告訴客戶進行排序 他們的行爲,並編寫使用XML。

理想情況下,如果我們只需指定xmldocument閱讀器的名稱空間和前綴,那將是最好的。 如

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

回答

0

這似乎是解決這個問題的辦法是改變XML加載到XmlDocument的方式。 而我之前解析一個字符串到xmldocument的loadxml方法。我現在將一個字符串解析爲一個字符串讀取器,然後將該字符串解析器解析爲一個xmltextreader。 xmltextreader具有Namespaces屬性,它允許您關閉名稱空間validataion。 然後可以將xmltextreader解析爲xmldocument的加載方法。

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