我正试图解析下面的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/addressing
的a
前缀和http://www.w3.org/2003/05/soap-envelope
的s
前缀。这就是为什么您对//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")