Php 将两个XPath合并为一个循环?

Php 将两个XPath合并为一个循环?,php,xml,xpath,domdocument,Php,Xml,Xpath,Domdocument,我使用xpath从文档中获取信息,唯一的问题是我无法将它们组合到1 for循环中,以便信息在页面上正确显示。我的代码是: <?php $doc = new DOMDocument; $doc->preserveWhiteSpace = FALSE; $doc->load('http://mdoerrdev.com/xml/updates-mits.xml'); $xpath = new DOMXPath($doc); $xpath->registerNamespace

我使用xpath从文档中获取信息,唯一的问题是我无法将它们组合到1 for循环中,以便信息在页面上正确显示。我的代码是:

<?php

$doc = new DOMDocument;
$doc->preserveWhiteSpace = FALSE;
$doc->load('http://mdoerrdev.com/xml/updates-mits.xml');

$xpath = new DOMXPath($doc);
$xpath->registerNamespace('MITS', "http://www.mitsproject.org/namespace");

$unitName  = $xpath->evaluate("//ILS_Unit[@FloorplanID='550584']/Unit/MITS:MarketingName");
$unitPrice = $xpath->evaluate("//ILS_Unit[@FloorplanID='550584']/Unit/MITS:Information/MITS:MarketRent");

?>

    <div class="unit-name">
        <?php
        foreach ($unitName as $un) {
            echo $un->nodeValue . "\n";
        }
        ?>
    </div>

    <div class="floor-plan-box fpb-one-bedroom cleafix"> <?php
        foreach ($unitPrice as $up) {
            echo $up->nodeValue . "\n";

            ?><img src='<?php bloginfo('stylesheet_directory'); ?>/img/floorplans/<?php echo "550584" ?>.jpg' /> <?php
        };
        ?>
    </div>
registerNamespace('MITS')http://www.mitsproject.org/namespace");
$unitName=$xpath->evaluate(“//ILS_Unit[@Floorplan id='550584']/Unit/MITS:MarketingName”);
$unitPrice=$xpath->evaluate(“//ILS_Unit[@floorplan id='550584']/Unit/MITS:Information/MITS:MarketRent”);
?>
/img/floorplan/.jpg'/>
(发件人:)


我需要将MarketRent和MarketingName信息组合在一起,而不是像在当前代码中那样单独显示它们。

这取决于您试图实现的目标。您可以使用Union运算符(管道
|
)组合两个xpath表达式:

然后将按文档顺序返回所有已计算的节点:

<div class="unit-name">
        1265.0000
C-304
1265.0000
C-308
1255.0000
C-204
1255.0000
C-208
1230.0000
C-102
1230.0000
C-103
    </div>
输出:

 * C-304 1265.0000
 * C-308 1265.0000
 * C-204 1255.0000
 * C-208 1255.0000
 * C-102 1230.0000
 * C-103 1230.0000
这可能更符合你的要求。同样,SimpleXMLElement可能更易于使用,因为它已经允许在字符串上下文中输出节点

此外,还有另一个概念可以直接将浅层对象映射到底层XML文档,这里已经概述了这个概念:


这是一个非常有趣的概念。IIRC我写了一些类似的东西,比如将一个xpath查询应用到另一个xpath查询的所有节点上,但我现在找不到它。

使用
$xpath->evaluate()
的上下文节点参数

对代码进行以下调整:

<?php

$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->load('http://mdoerrdev.com/xml/updates-mits.xml');

$xpath = new DOMXPath($doc);
$xpath->registerNamespace('MITS', "http://www.mitsproject.org/namespace");

$units = $xpath->evaluate("//ILS_Unit[@FloorplanID='550584']/Unit");
echo "<table>";
echo "<tr><th>Marketing Name</th><th>Market Rent</th></tr>";
foreach($units as $unit)  {
  $marketingName = $xpath->evaluate("string(MITS:MarketingName)", $unit);
  $marketRent = $xpath->evaluate("string(MITS:Information/MITS:MarketRent)", $unit);
  echo "<tr>";
  echo "  <td>" . $marketingName . "</td>";
  echo "  <td>" . $marketRent . "</td>";
  echo "</tr>";
}
echo "</table>";
?>
registerNamespace('MITS')http://www.mitsproject.org/namespace");
$units=$xpath->evaluate(“//ILS_Unit[@floorplan id='550584']/Unit”);
回声“;
呼应“市场租金”;
foreach(单位为$unit){
$marketingName=$xpath->evaluate(“字符串(MITS:marketingName)”,$unit);
$marketRent=$xpath->evaluate(“字符串(MITS:Information/MITS:marketRent)”,$unit);
回声“;
回声“$marketingName.”;
回声“$marketRent.”;
回声“;
}
回声“;
?>
生成此输出时,MarketingName和MarketRent将根据您的请求一起显示,而不是单独显示:

<?php

$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->load('http://mdoerrdev.com/xml/updates-mits.xml');

$xpath = new DOMXPath($doc);
$xpath->registerNamespace('MITS', "http://www.mitsproject.org/namespace");

$units = $xpath->evaluate("//ILS_Unit[@FloorplanID='550584']/Unit");
echo "<table>";
echo "<tr><th>Marketing Name</th><th>Market Rent</th></tr>";
foreach($units as $unit)  {
  $marketingName = $xpath->evaluate("string(MITS:MarketingName)", $unit);
  $marketRent = $xpath->evaluate("string(MITS:Information/MITS:MarketRent)", $unit);
  echo "<tr>";
  echo "  <td>" . $marketingName . "</td>";
  echo "  <td>" . $marketRent . "</td>";
  echo "</tr>";
}
echo "</table>";
?>

我忍不住再次尝试在某个XML源上应用模型。对于这个答案,我选择了
simplexmlement
。它仅仅是透明的,并且基本上只涉及xpath表达式。应该可以将同一界面翻译成
DOMDocument

$unitPrototype = new XPrototype(
    "//ILS_Unit[@FloorplanID='550584']/Unit",
    [
        'name'  => 'MITS:MarketingName',
        'price' => 'MITS:Information/MITS:MarketRent'
    ]
);

$units = new XList('http://mdoerrdev.com/xml/updates-mits.xml', $unitPrototype);

foreach ($units as $unit) {
    echo
    $unit->name, " ",
    $unit->price, "\n";
}

所用类型(如
XPrototype
XList
)的源代码位于Github:。

谢谢,非常感谢看到两种方法来实现我的需要。如果您使用evaluate,并且只处理结果的一个元素以获得其节点值,请编写
string()
表达式:
$xpath->evaluate(“string”)(MITS:MarketingName)”,$unit)
-这将返回一个字符串。@hakre,很好的建议。更新。谢谢!
$unitPrototype = new XPrototype(
    "//ILS_Unit[@FloorplanID='550584']/Unit",
    [
        'name'  => 'MITS:MarketingName',
        'price' => 'MITS:Information/MITS:MarketRent'
    ]
);

$units = new XList('http://mdoerrdev.com/xml/updates-mits.xml', $unitPrototype);

foreach ($units as $unit) {
    echo
    $unit->name, " ",
    $unit->price, "\n";
}