我有一个像这样的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_file
,User
和Computer
属性。
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>";
和User
。 Computer
的结果为空。
请帮帮我,谢谢!
答案 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
答案 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
是的