Php 使用XML DOM打印XML文件的内容
我有一个简单的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 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
的值作为字符串返回。我们可以很容易地证明该值是aDOMText
,尽管:
$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 "!!!"