Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用XML DOM打印XML文件的内容_Php_Xml_Dom - Fatal编程技术网

Php 使用XML DOM打印XML文件的内容

Php 使用XML DOM打印XML文件的内容,php,xml,dom,Php,Xml,Dom,我有一个简单的XML文档: <?xml version="1.0"?> <cellphones> <telefon> <model>Easy DB</model> <proizvodjac>Alcatel</proizvodjac> <cena>25</cena> </telefon> <telefon> <mode

我有一个简单的XML文档:

<?xml version="1.0"?>
<cellphones>
  <telefon>
    <model>Easy DB</model>
    <proizvodjac>Alcatel</proizvodjac>
    <cena>25</cena>
  </telefon>
  <telefon>
    <model>3310</model>
    <proizvodjac>Nokia</proizvodjac>
    <cena>30</cena>
  </telefon>
  <telefon>
    <model>GF768</model>
    <proizvodjac>Ericsson</proizvodjac>
    <cena>15</cena>
  </telefon>
  <telefon>
    <model>Skeleton</model>
    <proizvodjac>Panasonic</proizvodjac>
    <cena>45</cena>
  </telefon>
  <telefon>
    <model>Earl</model>
    <proizvodjac>Sharp</proizvodjac>
    <cena>60</cena>
  </telefon>
</cellphones>
对于XML中的每个节点

它必须使用XMLDOM来完成。这就是问题所在。我可以用通常的简单方法来做。但是这个问题困扰着我,因为我在互联网上似乎找不到任何解决办法

这是我所能做的,但我需要访问内部节点(子节点)并获取节点值。我还想去掉一些突然出现的奇怪字符串“#text”

<?php
    //kreira se DOMDocument objekat
    $xmlDoc = new DOMDocument();

    //u xml objekat se ucitava xml fajl
    $xmlDoc->load("poruke.xml");

    //dodeljuje se promenljivoj koreni element
    $x = $xmlDoc->documentElement;

    //prolazi se kroz petlju tako sto se ispisuje informacija o podelementima
    foreach ($x->childNodes AS $item){
        print $item->nodeName . " = " . $item->nodeValue . "<br />";
    }
?>


谢谢

我觉得你想要这样的东西:

<?php

$dom = new DOMDocument();
$dom->load("poruke.xml");

$telefon = $dom->getElementsByTagName('telefon');

foreach ($telefon as $t) {
    print "model: " . $t->childNodes->item(0)->nodeValue . "\n" .
          "proizvodjac: " . $t->childNodes->item(1)->nodeValue . "\n" . 
          "cena: " . $t->childNodes->item(2)->nodeValue;
}
$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->load('file.xml');

这是经过尝试和测试的解决方案

<?php

    $xmlDoc = new DOMDocument();

    $xmlDoc->load("mobiles.xml");

    $x = $xmlDoc->documentElement;

    $telefons = $x->getElementsByTagName( "telefon" );

    foreach( $telefons as $telefon )
  {

      $model = $telefon->getElementsByTagName( "model" );

      $proiz = $telefon->getElementsByTagName( "proizvodjac" );

      $cena = $telefon->getElementsByTagName( "cena" );


  echo $model->item(0)->nodeName .': '. $model->item(0)->nodeValue.' <br> '.$proiz->item(0)->nodeName .':'.$proiz->item(0)->nodeValue.'<br> '.$cena->item(0)->nodeName.':'.$cena->item(0)->nodeValue.' <br><br>';

  }


?>

试试看

$xmlDoc = new DOMDocument();

$dom->load("poruke.xml");

// Load the DomDoc into an Xpath object, you can then query it
$xpath = new DOMXpath($xmlDoc);

// Find all telefon elements
$result = $xpath->query("//telefon");

// For each telefon item found
foreach ($result AS $item){
    // For each child node of the telefon element print the nodeName and nodeValue
    foreach($item->childNodes as $node){
        echo $node->nodeName . " = " . $node->nodeValue . " <br />";
    }
}
$xmlDoc=newDOMDocument();
$dom->load(“poruke.xml”);
//将DomDoc加载到Xpath对象中,然后可以查询它
$xpath=newdomxpath($xmlDoc);
//查找所有telefon元素
$result=$xpath->query(“//telefon”);
//对于找到的每个telefon项目
foreach($result作为$item){
//对于telefon元素的每个子节点,打印nodeName和nodeValue
foreach($item->childNodes作为$node){
echo$node->nodeName。“=”$node->nodeValue。“
”; } }
奇怪文本字符串的解释

奇怪的文本字符串不是突然出现的,而是实际的文本节点。加载带有
DOM
的格式化XML文档时,默认情况下,任何空格(例如缩进、换行符和节点值)都将作为
DOMText
实例作为DOM的一部分,例如

<cellphones>\n\t<telefon>\n\t\t<model>Easy DB…
E           T   E        T     E      T      
然后,您的文档将按如下方式构造

<cellphones><telefon><model>Easy DB…
E           E        E      T
这段代码遍历给定XML中的所有telefon元素,并打印出其子节点的节点名、类型和URL编码的节点值。当您保留空白时,您将得到如下结果

Name: #text - Type: 3 - Value: %0A++++
Name: model - Type: 1 - Value: Easy+DB
Name: #text - Type: 3 - Value: %0A++++
Name: proizvodjac - Type: 1 - Value: Alcatel
Name: #text - Type: 3 - Value: %0A++++
Name: cena - Type: 1 - Value: 25
Name: #text - Type: 3 - Value: %0A++
…
我之所以对该值进行URL编码,是为了表明在
DOMDocument
中实际上存在包含缩进和换行符的
DOMText
节点<代码>%0A
是换行符,而每个
+
都是空格

当您将其与XML进行比较时,您将看到每个
元素后面都有一个换行符,后跟四个空格,直到
元素开始。同样,在结束
和开始
之间只有一条换行符和两个空格

这些节点的给定类型为3,即
XML\u TEXT\u节点
,例如
DOMText
节点。由于缺少正确的元素名称,这些节点的名称为#text

忽略空白

现在,当您禁用保留空白时,上面将输出:

Name: model - Type: 1 - Value: Easy+DB
Name: proizvodjac - Type: 1 - Value: Alcatel
Name: cena - Type: 1 - Value: 25
Name: model - Type: 1 - Value: 3310
…
如您所见,没有更多的文本节点,只有类型1节点,这意味着
XML\u元素节点
,例如
DOMElement

doElement包含DOMText节点

在一开始我说过,
DOMElements
的值也是
DOMText
实例。但在上面的输出中,它们却无处可寻。这是因为我们正在访问属性,该属性将
DOMText
的值作为字符串返回。我们可以很容易地证明该值是a
DOMText
,尽管:

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xml);
foreach ($dom->getElementsByTagName('telefon') as $telefon) {
    $node = $telefon->firstChild->firstChild; // 1st child of model
    printf(
        "Name: %s - Type: %s - Value: %s\n",
        $node->nodeName,
        $node->nodeType,
        urlencode($node->nodeValue)
    );
}
将输出

Name: #text - Type: 3 - Value: Easy+DB
Name: #text - Type: 3 - Value: 3310
Name: #text - Type: 3 - Value: GF768
Name: #text - Type: 3 - Value: Skeleton
Name: #text - Type: 3 - Value: Earl
Name: p - Type: 1 - Value: Hello World!!!
这证明了
domeElement
包含它的值作为
DOMText
nodeValue
直接返回
DOMText
的内容

更多关于nodeValue的信息

事实上,
nodeValue
足够聪明,可以连接任何
DOMText
子项的内容:

$dom = new DOMDocument;
$dom->loadXML('<root><p>Hello <em>World</em>!!!</p></root>');
$node = $dom->documentElement->firstChild; // p
printf(
    "Name: %s - Type: %s - Value: %s\n",
    $node->nodeName,
    $node->nodeType,
    $node->nodeValue
);
虽然这些实际上是

DOMText "Hello"
DOMElement em with DOMText "World"
DOMText "!!!"
使用XML DOM打印XML文件的内容


要最终回答您的问题,请查看第一个测试代码。你需要的一切都在里面。当然,到目前为止,你也得到了很好的其他答案。

找到了一个非常简单的方法:

$xml=$domElement->ownerDocument->saveXML($domElement);
或者如果您已经将文档保存在变量中

$xml=$document->saveXML($doElement);
解决方案位于:

始终记住XPath,它非常棒。它将使您的代码保持干净,并使在XML和HTML中查找元素比数组mashing容易得多。虽然我同意XPath非常棒(对于复杂的查询),但应该注意的是,OP仅使用
getElementsByTagName
并不能从这个特定的查询中获得任何好处。另外,除非加载带有
preserveWhitespace=FALSE
的XML,否则在迭代子节点时也会打印DOMText节点。我喜欢其他答案,因为它们帮助我快速简便,但这太多了,我无法表达我多么欣赏这一解释。真是太棒了,非常感谢!
Name: p - Type: 1 - Value: Hello World!!!
DOMText "Hello"
DOMElement em with DOMText "World"
DOMText "!!!"