代码之家  ›  专栏  ›  技术社区  ›  Re0sless

Delphi-IXMLNode中的命名空间URI无效

  •  1
  • Re0sless  · 技术社区  · 17 年前

    我正在使用的XML部分如下所示。

    <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <ResponseData xmlns="http://www.example.com/WebServices/Schemas/1">
            <ResponseDataResult>
                <Messages xmlns="http://www.example.com/WebServices/Schemas/2">
                    <Message>...</Message>
                </Messages>
            </ResponseDataResult>
            ...
        </ResponseData>
    </soap:Body>
    

    soap:Body节点中的xmlns URI正常,ResponseData中的那个无效,它指向一个不存在的文档。应该注意的是,web服务不在我的控制之下,因此修复它是不可能的:(。

    var l_tmp,l_tmp2,FSOAPBody:IXMLNode;
    
    begin
        ...
    
        FSOAPBody := FSOAPEnvelope.ChildNodes.FindNode('Body','http://schemas.xmlsoap.org/soap/envelope/');
        //returns the xml above.
        if (FSOAPBody = nil) then exit;
    
        l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData','');
        if (l_tmp = nil) or (not l_tmp.HasChildNodes) then exit;
    
        l_tmp2 := l_tmp.ChildNodes.FindNode('ResponseDataResult','');
    
        ...
    end;
    

    在上面的代码中,我不得不将空白命名空间URL添加到 FindNode('ResponseData','') 如果没有它,它将找不到任何东西并返回nil,但是它会重新生成预期的XML。

    问题是下一个查找节点( ChildNodes.FindNode('ResponseDataResult','') )在尝试访问l_tmp的子节点时引发访问冲突,我可以使用l_tmp.xml查看xml,并确定它是我期望的xml。

    1 回复  |  直到 10 年前
        1
  •  2
  •   Rob Kennedy    17 年前

    它是 不期而至 所有名称空间URI都引用实际资源。它们主要用作唯一标识符,因此来自多个源的XML可以使用相同的名称,而不会相互干扰。它们不需要指向描述名称空间的有效元素和属性值的模式;XML甚至不要求存在这样的模式。

    FindNode .

    l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData');
    

    l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData',
               'http://www.example.com/WebServices/Schemas/1');