Ruby 为什么可以';我不能从根元素中具有名称空间的XPath中获得结果吗?

Ruby 为什么可以';我不能从根元素中具有名称空间的XPath中获得结果吗?,ruby,xml,xpath,namespaces,nokogiri,Ruby,Xml,Xpath,Namespaces,Nokogiri,这可能是一个XML名称空间新手的问题,但我不知道如何使用XPath来处理具有此特定根元素的以下trunctated XML: <?xml version="1.0" encoding="UTF-8"?> <CreateOrUpdateEventsRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dhamma.org" version="3-0-0"> <Lan

这可能是一个XML名称空间新手的问题,但我不知道如何使用XPath来处理具有此特定根元素的以下trunctated XML:

<?xml version="1.0" encoding="UTF-8"?>
<CreateOrUpdateEventsRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dhamma.org" version="3-0-0">
   <LanguageKey>
    <IsoCode>en</IsoCode>
  </LanguageKey>
  <Publish>
    <Value>true</Value>
  </Publish>
  <Events>
    <Event>
      <EventKey>
        <LocationKey>
          <SubDomain>rasmi</SubDomain>
        </LocationKey>
        <EventId>10DayPDFStdTag</EventId>
      </EventKey>
    </Event>
  </Events>
   </LanguageKey>
</CreateOrUpdateEventsRequest>

如何使用XPath处理这样的名称空间?

我不使用Nokogiri或Ruby, 但是您需要为名称空间
http://dhamma.org

当我阅读 我知道你必须做类似的事情

$> @doc.xpath('//dha:LanguageKey', 'dha' => 'http://dhamma.org')

这里有一些代码要考虑。从创建Nokogiri::XML::文档的代码开始:

require 'nokogiri'

XML = <<EOT
    <?xml version="1.0" encoding="UTF-8"?>
    <CreateOrUpdateEventsRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dhamma.org" version="3-0-0">
       <LanguageKey>
        <IsoCode>en</IsoCode>
      </LanguageKey>
      <Publish>
        <Value>true</Value>
      </Publish>
      <Events>
        <Event>
          <EventKey>
            <LocationKey>
              <SubDomain>rasmi</SubDomain>
            </LocationKey>
            <EventId>10DayPDFStdTag</EventId>
          </EventKey>
        </Event>
      </Events>
       </LanguageKey>
    </CreateOrUpdateEventsRequest>
EOT

doc = Nokogiri::XML(XML)
说:

在使用CSS时,如果名称空间称为“xmlns”,甚至可以省略名称空间名称

您需要查看文档以了解有关各种方法的更多信息


作为第一次尝试,我建议使用CSS选择器,以使其比XPath更简单易读。我认为XPath有更多的功能,但有时会让我的眼睛发呆,所以我更喜欢CSS。

非常感谢您的帮助

答案似乎是XML重新声明了XMLNS,而它本应使用前缀声明名称空间,如
XMLNS:myns

从www.w3.org:

XML规范将所有以字母“x”、“m”、“l”开头的名称保留为大写和小写的任意组合,以供W3C使用。迄今为止,已经给出了三个这样的名称的定义,尽管这些名称不在XML名称空间中,但为了方便读者和用户,这里列出了它们:

  • xml:请参阅和
  • xmlns:参见
  • xml样式表:请参阅xml样式表处理说明
$> @doc.xpath('//dha:LanguageKey', 'dha' => 'http://dhamma.org')
require 'nokogiri'

XML = <<EOT
    <?xml version="1.0" encoding="UTF-8"?>
    <CreateOrUpdateEventsRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dhamma.org" version="3-0-0">
       <LanguageKey>
        <IsoCode>en</IsoCode>
      </LanguageKey>
      <Publish>
        <Value>true</Value>
      </Publish>
      <Events>
        <Event>
          <EventKey>
            <LocationKey>
              <SubDomain>rasmi</SubDomain>
            </LocationKey>
            <EventId>10DayPDFStdTag</EventId>
          </EventKey>
        </Event>
      </Events>
       </LanguageKey>
    </CreateOrUpdateEventsRequest>
EOT

doc = Nokogiri::XML(XML)
doc.root.name # => "CreateOrUpdateEventsRequest"
doc.at('CreateOrUpdateEventsRequest').name # => "CreateOrUpdateEventsRequest"
doc.at('LanguageKey').to_xml # => "<LanguageKey>\n        <IsoCode>en</IsoCode>\n      </LanguageKey>"
doc.at('//xmlns:LanguageKey').to_xml # => "<LanguageKey>\n        <IsoCode>en</IsoCode>\n      </LanguageKey>"
name_spaces = doc.collect_namespaces # => 
doc.at('//xmlns:LanguageKey', name_spaces).to_xml # => "<LanguageKey>\n        <IsoCode>en</IsoCode>\n      </LanguageKey>"