0

我必须在 xml 文档的标题中移动PrescriberOrderNumber到上面。Sent time在下面的代码中,当我可以创建节点时,它会将其扔到列表的底部。尝试使用InsertBefore时,会引发 Runtime 5 错误。

XML:

<Message xmlns="http://www.ncpdp.org/schema/SCRIPT" version="010" release="006">
    <Header>
        <To Qualifier="D">6199568422001</To>
        <From Qualifier="P">0001060</From>
        <MessageID>992a39320ba04a53b1e44094389c063a</MessageID>
        <SentTime>2013-07-03T14:24:47.005371Z</SentTime>
        <PrescriberOrderNumber>ZSUR10009D</PrescriberOrderNumber>
    </Header>

VBA 脚本:

    Case "SentTime"
        Dim objRoot As IXMLDOMNode
        Dim objMemberElem As IXMLDOMNode

        Set objRoot = oXMLDoc3.DocumentElement

        'Create 1 Child Element
        Set objMemberElem = oXMLDoc3.createElement("RelatesToMessageID")
        objMemberElem.Text = n.Text

        Set node = objRoot.SelectSingleNode("*/SentTime")
        objRoot.ChildNodes.Item(0).appendChild objMemberElem

        objRoot.InsertBefore objMemberElem, node

有任何想法吗?

4

1 回答 1

0

对于问题中详述的问题 - “我必须在 xml 文档的标题中移动PrescriberOrderNumber到上面” - 这应该有效:Sent time

Dim objHeader As IXMLDOMNode
Dim objPrescriberOrderNumber As IXMLDOMNode
Dim objSentTime As IXMLDOMNode

Set objHeader = oXMLDoc3.selectSingleNode("Message/Header")    
Set objPrescriberOrderNumber = objHeader.selectSingleNode("PrescriberOrderNumber")
Set objSentTime = objHeader.selectSingleNode("SentTime")
objHeader.insertBefore objPrescriberOrderNumber, objSentTime

在您调用的原始代码insertBefore中,objRoot但您需要调用insertBefore在其之前插入新节点的节点的父节点。node当您在其父母是之前插入时Header,您需要调用insertBeforeHeader不是Message

如果您还需要创建一个RelatesToMessageID子节点(如问题中的 VBA 代码所示),那么在之前插入该子节点SentTime将需要此附加代码:

Dim objMemberElem As IXMLDOMNode
Set objMemberElem = oXMLDoc3.createNode(NODE_ELEMENT, "RelatesToMessageID", oXMLDoc3.documentElement.namespaceURI)
objMemberElem.Text = n.Text

objHeader.insertBefore objMemberElem, objSentTime

请注意从createElement原始代码到createNode此处的更改 - 这是为了防止添加的元素与文档的其余部分位于不同的命名空间中

此外,using是MSXML2 v3.0 中较旧类型的 DOM 文档DOMDocument的同义词。DOMDocument30当前的 MSXML2 v6.0 DOM 文档将被声明为DOMDocument60. 应尽可能首选较新的版本 - 请参阅此处

使用DOMDocument60将需要对所提供的代码进行一些更改。具体来说,对 的调用selectSingleNode将更改为使用 XPath 而不是 XSL 模式。虽然在这种情况下,实际节点选择的语法是相同的,但 XPath 的 MSXML2 实现需要对默认名称空间进行额外的工作。您必须为默认命名空间声明一个前缀,然后在调用中使用该前缀selectSingleNode(有关详细信息,请参见此处),如下所示:

Dim oXMLDoc3 As MSXML2.DOMDocument60
Set oXMLDoc3 = New MSXML2.DOMDocument60
oXMLDoc3.setProperty "SelectionNamespaces", "xmlns:r='http://www.ncpdp.org/schema/SCRIPT'"

Set objHeader = oXMLDoc3.selectSingleNode("r:Message/r:Header")
于 2013-07-22T23:50:49.987 回答