Php 如何将嵌套XML转换为简单XML
首先,几天来我一直在寻找这个问题的答案,但都没有用——但是在处理了多年的原始.net之后,自学有一些挑战,如果这是一个非常基本的问题,那么很抱歉 两个问题:Php 如何将嵌套XML转换为简单XML,php,xml,xslt,transformation,Php,Xml,Xslt,Transformation,首先,几天来我一直在寻找这个问题的答案,但都没有用——但是在处理了多年的原始.net之后,自学有一些挑战,如果这是一个非常基本的问题,那么很抱歉 两个问题: XSLT或手动循环,或 我错过了什么 我试图在不使用任何附加库的情况下转换嵌套XML文档的“Items”元素: example.xml: 1. 拿铁 $ 4.50 0.50 豆浆 1. 0 糖 2. 转换为带有一些文本缩进的平面版本 ^^^ preceding text bits ^^^ <line> 1
1.
拿铁
$ 4.50
0.50
豆浆
1.
0
糖
2.
转换为带有一些文本缩进的平面版本
^^^ preceding text bits ^^^
<line> 1 Latte $4.50 </line>
<line> 1 x Soy Milk (0.50) </line>
<line> 2 x Sugar (0.00) </line>
---- continue for other bits ---
^^^^前面的文本位^^
一杯拿铁4.50美元
1倍豆浆(0.50)
2倍糖(0.00)
----继续其他位---
我肯定我错过了一些东西,因为这应该很容易,但我要花很长时间才能让它发挥作用:
$xml = simplexml_load_file('<<source file>>');
foreach($xml->Items->children() as $child)
{
echo '<text> ' . $child->qty . ' ' . $child->Name . ' ' . $child->Cost . '</text>';
}
$xml=simplexml\u load\u文件(“”);
foreach($xml->Items->children()作为$child)
{
回显'.$child->qty'.$child->Name'.$child->Cost'.';
}
所以我很确定我陷入了一个非常简单的新手错误。我会使用
XSLT
。具有以下样式表:
flatte.xsl
哪些产出:
一杯拿铁4.50美元
1份豆浆0.50
2倍糖0.00
您确定您在这里谈论的是XML,而不是您在这里或那里陷入了空白规范化规则?谢谢@hek2mgl你下面的回答太棒了-非常感谢我想我可以测量出这导致的额外秃顶:-)嗨@hakre-谢谢你提醒我一个可能的问题,一个我不知道为什么的问题。这就是为什么我使用$symbol来包装这些值-这是一个很好的提示(当然是对于像我这样的新玩家:-\)没问题。。问题是你为什么需要这个?一个只有
元素的xml文档没有多大意义,一个简单的文本文件是合适的,不是吗?Hi@hek2mgl主要原因是数据从一个(标准化的)系统移动到另一个(非标准化的)系统-谁知道为什么一个系统会将其非标准化。最终的结果是一个收据的PDF,因此它可能只是选择只循环
元素,而不是解析一个通用的XML文档。
$xml = simplexml_load_file('<<source file>>');
foreach($xml->Items->children() as $child)
{
echo '<text> ' . $child->qty . ' ' . $child->Name . ' ' . $child->Cost . '</text>';
}
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="/Order/Items/OrderItem">
<line>
<xsl:text> </xsl:text>
<xsl:value-of select="qty" />
<xsl:text> </xsl:text>
<xsl:value-of select="Name" />
<xsl:text> </xsl:text>
<xsl:value-of select="Cost" />
<xsl:text> </xsl:text>
</line>
<xsl:for-each select="Options"><xsl:text>
</xsl:text>
<line>
<xsl:text> </xsl:text>
<xsl:value-of select="QTY" />
<xsl:text> x </xsl:text>
<xsl:value-of select="Name" />
<xsl:text> </xsl:text>
<xsl:value-of select="Cost" />
<xsl:text> </xsl:text>
</line>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
$xml = new DOMDocument();
$xsl = new DOMDocument();
$xml->load("example.xml");
$xsl->load("flatten.xsl");
$xsltproc = new XSLTProcessor();
$xsltproc->importStyleSheet($xsl);
echo $xsltproc->transformToXML($xml);