【发布时间】:2011-02-10 16:57:38
【问题描述】:
我需要对 XML 文档进行一些解析和信息检索。 XML 文档绑定到 XML 数据绑定,然后针对特定元素进行解析。 一旦我隔离了我需要剖析的元素,我会依次取出每个元素(我们称之为 E_parent)并尝试识别每个非文本子元素(E_child)在 E_parent 的整个 XML 文本中的位置并进行一些操作或其他。
我遇到的问题是,当单独访问子元素时,XML 文档的命名空间被添加到了子元素的 XML 中。
举个例子,假设原始文档如下所示:
<?xml version="1.0" encoding="windows-1252"?>
<RootNode xml:lang="en" xmlns="urn:blah:names:blahblah">
<E_parent>Some text <E_child>child text</E_child> more parent text</E_parent>
</RootNode>
</xml>
当我尝试通过执行以下操作从 E_parent 或 E_child 元素访问 XML 时:
xmlParent := parentNode.XML;
我明白了:
<E_parent xmlns="urn:blah:names:blahblah">Some text <E_child>child text</E_child> more parent text</E_parent>
如果我尝试访问 E_child 的 XML,我会得到:
<E_child xmlns="urn:blah:names:blahblah">child text</E_child>
当我尝试对父元素进行文本搜索时,这是一个问题,因为“真实”文本不包含该命名空间声明:
Some text <E_child>child text</E_child> more parent text
到目前为止,我已经通过在字符串中查找/删除不需要的命名空间属性来解决这个问题,但它的效率非常低,而且有点难看;o) 所以,我的问题是,如何在不将文档命名空间添加到标签的情况下从绑定的 XML 文档中检索各个节点的 XML?
=========
感谢 Remy,这很明显,我只需要从一个空白字符串开始构建它,而不是从内部 XML 开始!
请注意,这比我在这种特定情况下的解决方法更好,但不是我想要的 - 获取没有命名空间的元素的 XML 仍然对其他事情有用,例如日志记录,其中我想要在原始文档中出现的节点的确切 XML。
【问题讨论】:
-
XML 中的文本搜索?您真正想在这里完成什么?
-
@Leonardo:我应该在发布答案之前问的问题。
-
如果您想记录确切的 XML,那么您根本不应该从您的 XML 对象中提取任何内容。这样做会 重新序列化 对象,因此即使它不包含名称空间,它仍可能与原始 XML 文本不同。相反,请返回并首先记录您放入 XML 对象的原始文本。
-
如果我只是浏览一个发送给我的 XML 文档,我就没有原件,我需要以某种方式得到它。我只是通过我的绑定类加载 XML 并访问该元素,寻找其确切的外部 XML。这是我的全部问题,现在看来我唯一的选择是从中获取元素,获取其内部 XML 并手动解析,或者直接获取元素的 XML 并删除 namspace 属性。无论哪种方式,都必须进行一些“手动”字符串操作
标签: xml delphi namespaces msxml