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

发布于 2024-10-14 03:20:59 字数 2137 浏览 8 评论 0原文

我正在编写一个接受来自客户的 XML 的软件。 xml 有 2 个部分,一个包含设置字段的标准部分,以及一个允许我们的客户添加自己的 xml 的自由格式部分。

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

系统经过设置,以便整体文档具有涵盖 xml 的所有部分(除了 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 以进行进一步处理。

到目前为止,没有问题。这一切都可以很好地读入 xml 文档中。 不幸的是,我们的一些客户在其自定义 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 文档失败,因为 xml 中未声明前缀。我尝试通过从代码中删除所有名称空间前缀来解决此问题,但这会在稍后的处理中导致问题,因为客户端的架构要求前缀位于标签上。

一些进一步的问题

  • 我们有许多客户有不同的 模式和不同的命名空间。
  • 每个 XML 文件可以有多个 不同的 FreeXML 元素 部分(所以不可能 只需将 FreeXML 部分提取为 不同的客户端使用 1 个或多个并且 在不同位置使用部分 贯穿整个文件。
  • 我们无法编辑客户端的架构。
  • 我们不能告诉客户排序 他们执行并编写工作 xml。

理想情况下,如果我们可以只指定 xmldocument 读取器的名称空间和前缀,那就最好了。 例如

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

I'm writing a piece of software that accepts XML from our clients.
The xml has2 parts, a standard part that contains set fields, and a freeform part that allows our clients to add own their own xml

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

The system is set so that the OverallDocument has a schema that covers all sections of the xml except what goes inside the FreeXML tags.
The contents of the FreeXML tags has it's own schema sent to us by our client.

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

In this case the client's xml looks like this

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

The program is trying to extract the client's custom xml for further processing.

So far, no problems. this all reads nicely into an xmldocument.
Unfortunatly some of our clients use namespace prefixes on their custom xml without declaring the prefixes in the xml document.

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

This causes the xmldocument to fall over as the prefixes are not declared in the xml. I tried getting around this by removing all namespace prefixes from the code, but this causes issues later on in the processing as the clients' schemas require the prefixes to be on the tags.

some further problems

  • We have many clients with different
    schemas and different namespaces.
  • Each XML file can have multiple
    FreeXML elements in different
    sections (so it's not possible to
    simply extract the FreeXML section as
    different clients use 1 or more and
    use sections in different locations
    throughout the document.
  • We cannot edit the clients' schema.
  • We cannot tell the clients to sort
    their act out and write working xml.

Ideally it would be best if we can just specify the namespace and prefix to the xmldocument reader.
eg

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

过潦 2024-10-21 03:20:59

解决此问题的方法似乎是更改 xml 加载到 xmldocument 中的方式。
而之前我将字符串解析为 xmldocument 的 loadxml 方法。我现在将字符串解析为 stringreader,然后将 stringreader 解析为 xmltextreader。
xmltextreader 具有 Namespaces 属性,允许您关闭命名空间验证。
然后可以将 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

It seems the way to fix this is to change the way the xml is loaded into the xmldocument.
Whereas before i was parsing a string into the loadxml method of the xmldocument. I now parse a string into a stringreader, then parse the stringreader into an xmltextreader.
The xmltextreader has the Namespaces property which allows you to turn namespace validataion off.
The xmltextreader can then be parsed into the load method of the 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文