PHP simplexml_load_file 2个标记在xml文件中

时间:2018-05-04 03:31:18

标签: php xml

我有一个像这样的xml文件

new Dict({{1, true}})

我使用<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <Job> <JobInfo> <User>abc</User> <Computer>acb</Computer> <Started>2018/04/21-21:58:30:0182-06</Started> <Ended>2018/04/21-23:10:10:0093-06</Ended> </JobInfo> <JobFlags> <Active>Yes</Active> <Complete>Yes</Complete> </JobFlags> </Job> 加载文件并打印出simplexml_load_fileUserComputer属性。

Complete

但它只打印出$xml=simplexml_load_file("abc.xml") or die("Error: Cannot create object"); foreach($xml->children() as $xm) { echo $xm->User . "<br>"; echo $xm->Computer . "<br>"; echo $xm->Complete . "<br>"; UserComputer的结果为空。 请帮帮我,谢谢!

4 个答案:

答案 0 :(得分:0)

尝试将所有元素包装到父标记中:

    <?xml version="1.0"?>
<test>
    <JobInfo>
        <User>abc</User>
        <Computer>acb</Computer>
        <Started>2018/04/21-21:58:30:0182-06</Started>
        <Ended>2018/04/21-23:10:10:0093-06</Ended>
    </JobInfo>
    <JobFlags>
        <Active>Yes</Active>
        <Complete>Yes</Complete>
    </JobFlags>
</test>

然后在你的php中引用:

<?php 
$xml=simplexml_load_file("abc.xml") or die("Error: Cannot create object");
echo $xml->JobInfo->User . "<br>";
echo $xml->JobInfo->Computer . "<br>";
echo $xml->JobFlags->Complete . "<br>";
?>

它在这里工作。

我认为这只是对标签的整个层次结构进行正确引用的问题。

请参阅http://php.net/manual/en/function.simplexml-load-file.php中的此示例:

<?php 
$xml = '<?xml version="1.0" encoding="UTF-8" ?> 
<rss> 
    <channel> 
        <item> 
            <title><![CDATA[Tom & Jerry]]></title> 
        </item> 
    </channel> 
</rss>'; 

$xml = simplexml_load_string($xml); 

// echo does the casting for you 
echo $xml->channel->item->title; 

// but vardump (or print_r) not! 
var_dump($xml->channel->item->title); 

// so cast the SimpleXML Element to 'string' solve this issue 
var_dump((string) $xml->channel->item->title); 
?> 

Above will output: 

Tom & Jerry 

object(SimpleXMLElement)#4 (0) {} 

string(11) "Tom & Jerry"

参考:

答案 1 :(得分:0)

simplexml有点过时。不确定<complete>标签是否有效,xml,可能是问题。

如果可以,请尝试使用 php-dom https://php.net/manual/en/book.dom.php

检索所有标签文本的示例。

#!/usr/bin/php
<?php
$remote =<<<'EOF'
<JobInfo>
<User>abc</User>
<Computer>acb</Computer>
<Started>2018/04/21-21:58:30:0182-06</Started>
<Ended>2018/04/21-23:10:10:0093-06</Ended>
</JobInfo>
<JobFlags>
<Active>Yes</Active>
<Complete>Yes</Complete>
</JobFlags>

EOF;

$i = 0;

$doc = new DOMDocument();
$doc->loadHTML($remote);
foreach($doc->getElementsByTagName('*') as $elem) {
    echo $i++.": ".$elem->textContent;
}

包围到php-xml:

  

包php-dom是一个虚拟包,提供者:php7.2-xml

替代方案:https://php.net/manual/en/refs.xml.php

答案 2 :(得分:0)

对我来说效果很好:

__next__

您可能会感到困惑,因为您希望连续三行都能完成所有这些操作。尝试以这样的方式输出它,它可以帮助您可视化它回显所有三个所请求的元素(无论它们是否存在)两个循环(因为XML有两个孩子):

abc
acb



Yes

将输出:

foreach($xml->children() as $xm) { 
    echo "Current Element: " . $xm->getName()  . "<br />";
    echo "User: " . $xm->User . "<br />";
    echo "Computer: " . $xm->Computer . "<br />";
    echo "Complete: " . $xm->Complete . "<br />";
}

正如尼克在评论中所说,如果您不希望在元素不存在时打印Current Element: JobInfo User: abc Computer: acb Complete: Current Element: JobFlags User: Computer: Complete: Yes 符号,则可以使用<br />,如:

isset

或者,正如NigelRen在答案中所建议的那样,如果您知道所需元素的完整路径,则可以跳过使用foreach($xml->children() as $xm) { echo isset($xm->User) ? "{$xm->User}<br />" : ''; echo isset($xm->Computer) ? "{$xm->Computer}<br />" : ''; echo isset($xm->Complete) ? "{$xm->Complete}<br />" : ''; } ,而只需使用这些路径,例如:

children()

潜在的问题是,当您在遍历echo $xml->JobInfo->User . "<br />"; echo $xml->JobInfo->Computer . "<br />"; echo $xml->JobFlags->Complete . "<br />"; 元素时回显$xm->Complete时,它只输出JobInfo,因为<br />不存在。< / p>

答案 3 :(得分:0)

主要问题是您正在尝试混合来自不同元素的字段。您可以从原始XML中看到<User><Computer>位于<JobInfo>元素中,<Complete>位于<JobFlags>元素中。这不是问题,但是当您使用foreach循环时,您将遍历<Job>的每个子元素并输出每个元素的所有值。如果您将循环更改为...

foreach($xml->children() as $tag => $xm) {
    echo "element=".$tag . "<br>";
    echo $xm->User . "<br>";
    echo $xm->Computer . "<br>";
    echo $xm->Complete . "<br>";
}

你得到(请原谅错误的标记,我想要布局)......

  

元素= JOBINFO
ABC
ACB

元素= JobFlags


是的

如果您只需要文档中的这三条信息,则可以使用完整路径访问它们,因此只需在不使用foreach的情况下选择您的详细信息...

echo $xml->JobInfo->User . "<br>";
echo $xml->JobInfo->Computer . "<br>";
echo $xml->JobFlags->Complete . "<br>";

给你。

  

ABC
ACB
是的