Фильтрация в результатах запроса DOM XPath - PullRequest
1 голос
/ 18 марта 2011

Поэтому я использую XPath для поиска довольно большого XML-документа. Что я хотел бы сделать, так это после получения начальных результатов выполнить поиск в этих результатах (а затем выполнить поиск еще 2 раза). Тем не менее, я не уверен, как искать снова. Я попробовал это:

Несколько запросов с использованием '|' Оператор:

    $dom = new DOMDocument();
    $dom->load('courses.kml');
    $xpath = new DOMXPath($dom);
    $xpath->registerNamespace('kml', "http://earth.google.com/kml/2.1");
    //merge queries using | operator 
$query = $xpath->query("//kml:Placemark[kml:type='".$_POST['type']."'] | //kml:Placemark[kml:club_type='".$_POST['club_type']."']"); 

            foreach($query as $result){
                 echo $result->nodeValue . "<br /><br />";
            }

Применение второго выражения XPath к первому объекту запроса:

$dom = new DOMDocument();
$dom->load('courses.kml');
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('kml', "http://earth.google.com/kml/2.1");
$query = $xpath->query("//kml:Placemark[kml:type='".$_POST['type']."']");

$xpath2 = new DOMXPath($query);
$query2 = $xpath2->query("//[club_type='".$_POST['club_type']."']");

        //echo $result->nodeValue . "<br /><br />";
        foreach($query2 as $result2){
             echo $result2->nodeValue . "<br /><br />";
        }

Но, похоже, это не сработало, поэтому я попытался:

Запустить два отдельных экземпляра и объединить

//1st
$dom = new DOMDocument();
$dom->load('courses.kml');
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('kml', "http://earth.google.com/kml/2.1");
$query = $xpath->query("//kml:Placemark[kml:club_type='".$_POST['club_type']."']");

//2nd
$dom2 = new DOMDocument();
$dom2->load('courses.kml');
$xpath2 = new DOMXPath($dom2);
$xpath2->registerNamespace('kml', "http://earth.google.com/kml/2.1");
$query2 = $xpath2->query("//kml:Placemark[kml:type='".$_POST['type']."']");

//merge object
$obj_merged = (array) array_merge((array) $query, (array) $query2);
foreach($obj_merged as $result){
    echo $result->nodeValue . "<br /><br />";
}

И я пробовал и другие вещи, в том числе следующие рекомендации: php xpath: query в результате запроса , хотя это не совсем то же самое, я все еще не мог получить результаты. Я не получаю никаких ошибок, только пустые страницы.

уточнить:

Если бы это был мой XML-документ:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
    <Document>
      <Placemark id="placemark1">
          <name>Test Country Club1 </name>
          <description>
              <![CDATA[
                 <div class="contact">Post Office Box 329 <a href="#" target="_blank">website</a></div>
              ]]>
          </description>
          <alpha>a</alpha>
          <position>2</position>
          <type>Public/Daily Fee</type>
          <club_type>other</club_type>
          <hole_type>9hole</hole_type>
          <styleUrl>#nineholeStyle</styleUrl>
          <Point>
              <coordinates>-79.285576,37.111809</coordinates>
          </Point>
      </Placemark>
      <Placemark id="placemark2">
          <name>Test Country Club2</name>
          <description>
              <![CDATA[
                 <div class="contact">Post Office Box 329 <a href="#" target="_blank">website</a></div>
              ]]>
          </description>
          <alpha>a</alpha>
          <position>2</position>
          <type>Public/Daily Fee</type>
          <club_type>other</club_type>
          <hole_type>9hole</hole_type>
          <styleUrl>#nineholeStyle</styleUrl>
          <Point>
              <coordinates>-79.285576,37.111809</coordinates>
          </Point>
      </Placemark>
      <Placemark id="placemark3">
          <name>Test Country Club3</name>
          <description>
              <![CDATA[
                 <div class="contact">Post Office Box 329 <a href="#" target="_blank">website</a></div>
              ]]>
          </description>
          <alpha>a</alpha>
          <position>3</position>
          <type>Public/Daily Fee</type>
          <club_type>other</club_type>
          <hole_type>9hole</hole_type>
          <styleUrl>#nineholeStyle</styleUrl>
          <Point>
              <coordinates>-79.285576,37.111809</coordinates>
          </Point>
      </Placemark>
      <Placemark id="placemark4">
          <name>Test Country Club4</name>
          <description>
              <![CDATA[
                 <div class="contact">Post Office Box 329 <a href="#" target="_blank">website</a></div>
              ]]>
          </description>
          <alpha>a</alpha>
          <position>4</position>
          <type>Private</type>
          <club_type>Greengrass</club_type>
          <hole_type>18hole</hole_type>
          <styleUrl>#nineholeStyle</styleUrl>
          <Point>
              <coordinates>-79.285576,37.111809</coordinates>
          </Point>
      </Placemark>
  </Document>
</kml>

Как мне искать type, club_type, hole_type и / или alpha? Скажите, если бы я хотел вернуть только 18-луночные клубы Private Greengrass, начинающиеся с 'a'

1 Ответ

2 голосов
/ 18 марта 2011

возвращаются только частные 18-луночные клубы Greengrass, начинающиеся с 'a'

В XPath это выглядело бы (я предполагаю, что " начинается с 'a' ", что вы подразумеваете, что <alpha> - это буква)

/kml:kml/kml:Document/kml:Placemark[
        kml:type      = 'Private'
    and kml:club_type = 'Greengrass'
    and kml:hole_type = '18hole'
    and kml:alpha     = 'a'
]

Также помните, что вы можете посмотреть на length свойство DOMNodeList, возвращаемое из DOMXPath::query(). Например

$query = "
    /kml:kml/kml:Document/kml:Placemark[
            kml:type      = 'Private'
        and kml:club_type = 'Greengrass'
        and kml:hole_type = '18hole'
        and kml:alpha     = 'a'
    ]
";
$places = $xpath->query($query);

echo "Found {$places->length} matching places" . PHP_EOL;
foreach ($places as $place) {
    $name = $place->getElementsByTagName('name')->item(0)->textContent;
    echo " - " . $name . PHP_EOL;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...