我正在编写一个接受客户XML的软件。 xml有2个部分,一个包含设置字段的标准部分,以及一个允许我们的客户自己添加xml的自由部分
<OverallDocument>
<SetFields>
<name>Jon Doe</name>
<age>24</age>
<sex>M</sex>
</SetFields>
<FreeXML>
<!--custom xml goes here-->
</FreeXML>
</OverallDocument>
设置系统,以便OverallDocument具有覆盖xml的所有部分的模式,除了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>
由于未在xml中声明前缀,因此导致xmldocument翻倒。我尝试通过从代码中删除所有名称空间前缀来解决这个问题,但这会在处理中导致问题,因为客户端的模式要求前缀位于标记上。
一些其他问题
理想情况下,如果我们只能为xmldocument阅读器指定名称空间和前缀,那将是最好的。 例如
dim xdoc as xmldocument = xmldocument
'add namespace and prefix
xdoc.loadxml(xmlcode)
答案 0 :(得分:0)
似乎解决这个问题的方法是改变xml加载到xmldocument中的方式。 而在我将字符串解析为xmldocument的loadxml方法之前。我现在将字符串解析为stringreader,然后将stringreader解析为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