gpt4 book ai didi

delphi - MSXML - 命名空间信息不持久

转载 作者:行者123 更新时间:2023-12-03 18:43:52 24 4
gpt4 key购买 nike

我正在使用 MSXML 6.0 将我自己的 XML 转换为另一种 XML 格式。我不确定我是否只是不明白 MSXML 是如何工作的,但我相信我已经注意到它的一些奇怪行为......

我正在使用 setProperty 将 namespace 添加到我的 XML 文档中。方法例如

XmlDocument.setProperty('SelectionNamespaces',
' xmlns:ms=''http://mydomain.com/2010/MySchema''');

然后我在内存中使用我自己的自定义序列化程序构建 XML(不保存到磁盘)。序列化后,我加载 XSLT 文件并使用 transformNodeToObject 执行转换例如
AppXmlDoc.transformNodeToObject(XslXmlDoc, AStreamForTransformedXml);

问题是转换正在工作,但没有一个与我在其中的 XPath 匹配的特定模板。我通过 Visual Studio 使用测试数据运行 XSLT 文件本身消除了任何问题,它按预期工作。然后我认为它一定是一个编码问题,所以我确保所有涉及的文档都被读/写为 UTF-8 ......仍然没有运气。

以下是转换的示例:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="http://mydomain.com/2010/MySchema" exclude-result-prefixes="ms">
<xsl:template match="/">
<ARoot>
<head>
<xsl:apply-templates select="ms:Element/ms:SubElement" />
</head>
<body>
<xsl:apply-templates select="ms:Element/ms:DifferentSubElement" />
</body>
</ARoot>

因此,通过 MSXML 运行时的转换结果带来了基本结构,但不包含任何模板数据。经过一些测试,我发现让它工作的唯一方法是按照以下步骤进行:
  • 创建一个新的 XML 文档
  • 使用 setProperty 设置命名空间信息
  • 序列化 XML 并保存到磁盘。
  • 关闭文档 - 额外步骤
  • 创建一个新的 Xml 文档 - 额外步骤
  • 重新加载文档 - 额外步骤
  • 重新设置命名空间信息 - 额外步骤
  • 执行变换。

  • 因此,MSXML 似乎在某些时候失去了对命名空间信息的跟踪。更奇怪的是,即使您重置命名空间信息(在序列化之后)并尝试转换它仍然不起作用!它似乎只有在我保存文档、关闭它并重新创建一个新的 XML 文档并将其重新加载(因此我需要重置命名空间)时才有效。

    有人对此有任何想法/想法吗?

    最佳答案

    SelectionNamespace property用于带有 selectNodes 和 selectSingleNode 方法的 XPath,而不是用于 XSLT 或其他目的。所以我不确定你为什么设置它以及你期望它有什么帮助,因为你似乎没有使用 selectNodes 或 selectSingleNode。
    您想用 MSXML 6 实现什么?如果要在命名空间中创建一些带有元素和/或属性的 MSXML DOM 文档,请确保使用 createNode,因为这是 MSXML API 中唯一的命名空间感知方法。

    关于delphi - MSXML - 命名空间信息不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3882891/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com