在vb.net中添加XML命名空间引用

时间:2011-01-24 12:32:36

标签: xml vb.net xmldocument xml-namespaces

我正在编写一个接受客户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翻倒。我尝试通过从代码中删除所有名称空间前缀来解决这个问题,但这会在处理中导致问题,因为客户端的模式要求前缀位于标记上。

一些其他问题

  • 我们有很多不同的客户 模式和不同的命名空间。
  • 每个XML文件可以有多个 FreeXML元素不同 部分(因此不可能 只需将FreeXML部分解压缩为 不同的客户使用1个或更多 使用不同位置的部分 整个文件。
  • 我们无法编辑客户的架构。
  • 我们无法告诉客户排序 他们的行为和写作xml。

理想情况下,如果我们只能为xmldocument阅读器指定名称空间和前缀,那将是最好的。 例如

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

1 个答案:

答案 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