8

Nokogiri、Ruby、XPathを使用してXMLファイルを解析しようとしています。通常、問題は発生しませんが、次の場合、xpath要求を行うことができません。

doc = Nokogiri::HTML(open("myfile.xml"))
doc.("//Meta").count 
# result ==> 0

doc.xpath("//Meta") 
# result ==> []

doc.xpath(.).count
# result => 1

これが私のXMLファイルの簡略版です

<Answer xmlns="test:com.test.search" context="hf%3D10%26target%3Dst0" last="0" estimated="false" nmatches="1" nslices="0" nhits="1" start="0">
  <time>
    ...
  </time>
  <promoted>
    ...
  </promoted>
  <hits>
    <Hit url="http://www.test.com/" source="test" collapsed="false" preferred="false" score="1254772" sort="0" mask="272" contentFp="4294967295" did="1287" slice="1">
      <groups>
        ...
      </groups>
      <metas>
        <Meta name="enligne">
          <MetaString name="value">
          </MetaString>
        </Meta>

        <Meta name="language">
          <MetaString name="value">
            fr
          </MetaString>
        </Meta>
        <Meta name="text">
          <MetaText name="value">
            <TextSeg highlighted="false" highlightClass="0">
              La
            </TextSeg>
          </MetaText>
        </Meta>
      </metas>
    </Hit>
  </hits>
  <keywords>
    ...
  </keywords>
  <groups>
    ...
  </groups>

<Hit>このXMLからすべての子を取得するにはどうすればよいですか?

4

3 に答える 3

18

呼び出すときに名前空間情報を含めますxpath

doc.xpath("//x:Meta", "x" => "test:com.test.search")
于 2012-06-22T14:50:51.280 に答える
11

この方法を使用してremove_namespaces!、1日を節約できます。

于 2012-11-22T14:29:47.623 に答える
1

これは、XPAthに関する最もよくある質問の1つです。「XPathデフォルトの名前空間」を検索してください。

デフォルトの名前空間に名前空間を登録し、登録されたプレフィックス(たとえば)を使用する方法がない場合は"x"、次を使用します。//x:Meta

//*[name() = 'Meta` and namespace-uri()='test:com.test.search']

デフォルトの名前空間にのみ属することができることがわかっている場合はMeta、上記を次のように短縮できます。

//*[name() = 'Meta`]
于 2012-06-22T14:30:34.323 に答える