尝试用nokogiri和ruby解析xml



我正试图解析下面的xml以获得电子邮件地址。我可以获得messageid,但我认为在前面加a:使我能够使用xpath。不知道怎么取出邮箱地址。

xml.xpath("//s:身体/发现/请求/EmailAddress").children.text.to_s

xml.xpath("//s:身体/发现/EmailAddress").children.text.to_s

如果我做xml.xpath("//s:Body").children.text。To_s我得到电子邮件和所有换行符和制表符的版本,但如果没有必要,我不想解析电子邮件。

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Header> 
        <a:Action s:mustUnderstand="1">test url</a:Action> 
        <a:MessageID>mid</a:MessageID> 
        <a:ReplyTo> 
            <a:Address>test url</a:Address> 
        </a:ReplyTo> 
        <a:To s:mustUnderstand="1">test url</a:To> 
    </s:Header> 
    <s:Body> 
        <Discover xmlns="test url"> 
            <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
                <EmailAddress>bob@xml.com</EmailAddress> 
                <RequestVersion>1.0</RequestVersion> 
            </request> 
        </Discover> 
    </s:Body> 
</s:Envelope>

test url阻止Nokogiri的Xpath捕捉到s:Body中的名称空间。试着简单的

 email = xml.xpath("//s:Body").first.to_xml.scan(/<EmailAddress>([^<]+)/)[0][0]

Discover元素(及其子元素)位于不同的名称空间中,您需要在查询中指定这一点。xpath方法的第二个参数是一个散列,您可以将查询中使用的前缀与名称空间url关联起来。请查看Nokogiri教程中的名称空间部分。

使用Nokogiri,如果您没有指定名称空间哈希,它将自动为您注册在根节点上定义的任何名称空间。在本例中,这是http://www.w3.org/2005/08/addressinga前缀和http://www.w3.org/2003/05/soap-envelopes前缀。这就是为什么您对//s:Body的查询有效。Discover的名称空间声明不在根目录上,因此您必须自己注册它。

当您提供自己的命名空间哈希时,Nokogiri不会添加在根上定义的哈希,因此您还需要包含查询中使用的任何名称空间哈希。

在您的示例中,下面将找到EmailAddress节点。只要URI匹配,您使用的实际前缀并不重要(这里我选择了t)。

xml.xpath('//s:Body/t:Discover/t:request/t:EmailAddress',
    's' => "http://www.w3.org/2003/05/soap-envelope",
    't' => "test url")

相关内容

  • 没有找到相关文章

最新更新