如何在PHP中从XML中获取和读取特定数据?
大家好,我有这个XML结构,我想获得如何在PHP中从XML中获取和读取特定数据?,php,xml,xpath,Php,Xml,Xpath,大家好,我有这个XML结构,我想获得IdDocumento属性的值 <pago10:Pagos> <pago10:Pago> <pago10:DoctoRelacionado IdDocumento="B670AD5D-8BA6-42CF-A0D0-1A403E042FBA" /> </pago10:Pago> <pago10:Pago> <pago10:DoctoRelac
IdDocumento
属性的值
<pago10:Pagos>
<pago10:Pago>
<pago10:DoctoRelacionado IdDocumento="B670AD5D-8BA6-42CF-A0D0-1A403E042FBA" />
</pago10:Pago>
<pago10:Pago>
<pago10:DoctoRelacionado IdDocumento="B670AD5D-8BA6-42CF-A0D0-1A403E042FBA" />
<pago10:DoctoRelacionado IdDocumento="842b32ce-44c1-4b31-96b8-3a34569c698c" />
</pago10:Pago>
</pago10:Pagos>
我尝试过以下方法:
$xml = simplexml_load_file('complemento.xml');
$ns = $xml->getNamespaces(true);
$xml->registerXPathNamespace('p', $ns['pago10']);
if ($xml->xpath('//p:Pagos')) {
foreach ($xml->xpath('//p:Pagos') as $pagos10) {
foreach ($xml->xpath('//p:Pago') as $pago10) {
foreach ($xml->xpath('//p:DoctoRelacionado') as $doc) {
echo $doc['IdDocumento'] . '<br>';
}
echo "=========================================";
}
}
}
$xml=simplexml\u加载文件('complemento.xml');
$ns=$xml->getnamespace(true);
$xml->registerXPathNamespace('p',$ns['pago10']);
if($xml->xpath('//p:Pagos')){
foreach($xml->xpath('//p:Pagos')作为$pagos10){
foreach($xml->xpath('//p:Pago')作为$pago10){
foreach($xml->xpath('//p:DoctoRelacionado')作为$doc){
echo$doc['IdDocumento']。
;
}
回声“==================================================================================”;
}
}
}
但这同时显示了3个属性IdDocumento
,我希望打印第一个属性
属性IdDocumento
并设置分隔符,然后打印另外两个,如何知道是哪一个
IdDocumento属于每个pago10:Pago
节点
预期结果:
B670AD5D-8BA6-42CF-A0D0-1A403E042FB
========================================
B670AD5D-8BA6-42CF-A0D0-1A403E042FBA
842b32ce-44c1-4b31-96b8-3a34569c698c
我得到的是:
B670AD5D-8BA6-42CF-A0D0-1A403E042FB
B670AD5D-8BA6-42CF-A0D0-1A403E042FBA
842b32ce-44c1-4b31-96b8-3a34569c698c
========================================
B670AD5D-8BA6-42CF-A0D0-1A403E042FB
B670AD5D-8BA6-42CF-A0D0-1A403E042FBA
842b32ce-44c1-4b31-96b8-3a34569c698c
问题之一是您总是使用
$xml
作为XPath的起点,因此这总是返回到文档的顶层以查找下一层元素。在此代码中,它使用前面的foreach()
中的元素作为起点
$ns = $xml->getNamespaces(true);
$xml->registerXPathNamespace('pago10', $ns['pago10']);
if ($xml->xpath('//pago10:Pagos')) {
foreach ($xml->xpath('//pago10:Pagos') as $pagos10) {
foreach ($pagos10->xpath('descendant::pago10:Pago') as $pago10) {
foreach ($pago10->xpath('descendant::pago10:DoctoRelacionado') as $doc) {
echo $doc['IdDocumento'] . '<br>';
}
echo "=========================================".PHP_EOL;
}
}
}
还请注意,它使用子体轴(“子体::
),因此它只使用位于起点下的元素
$ns = $xml->getNamespaces(true);
$xml->registerXPathNamespace('pago10', $ns['pago10']);
if ($xml->xpath('//pago10:Pagos')) {
foreach ($xml->xpath('//pago10:Pagos') as $pagos10) {
foreach ($pagos10->xpath('descendant::pago10:Pago') as $pago10) {
foreach ($pago10->xpath('descendant::pago10:DoctoRelacionado') as $doc) {
echo $doc['IdDocumento'] . '<br>';
}
echo "=========================================".PHP_EOL;
}
}
}
$ns=$xml->getnamespace(true);
$xml->registerXPathNamespace('pago10',$ns['pago10']);
if($xml->xpath('//pago10:Pagos')){
foreach($xml->xpath('//pago10:Pagos')作为$pagos10){
foreach($pagos10->xpath('genderant::pago10:Pago')作为$pago10){
foreach($pago10->xpath('genderant::pago10:DoctoRelacionado')作为$doc){
echo$doc['IdDocumento']。
;
}
echo“===================================================================”.PHP_EOL;
}
}
}
问题之一是,您总是使用$xml
作为XPath的起点,因此这总是返回到文档的顶层以查找下一层元素。在此代码中,它使用前面的foreach()
中的元素作为起点
$ns = $xml->getNamespaces(true);
$xml->registerXPathNamespace('pago10', $ns['pago10']);
if ($xml->xpath('//pago10:Pagos')) {
foreach ($xml->xpath('//pago10:Pagos') as $pagos10) {
foreach ($pagos10->xpath('descendant::pago10:Pago') as $pago10) {
foreach ($pago10->xpath('descendant::pago10:DoctoRelacionado') as $doc) {
echo $doc['IdDocumento'] . '<br>';
}
echo "=========================================".PHP_EOL;
}
}
}
还请注意,它使用子体轴(“子体::
),因此它只使用位于起点下的元素
$ns = $xml->getNamespaces(true);
$xml->registerXPathNamespace('pago10', $ns['pago10']);
if ($xml->xpath('//pago10:Pagos')) {
foreach ($xml->xpath('//pago10:Pagos') as $pagos10) {
foreach ($pagos10->xpath('descendant::pago10:Pago') as $pago10) {
foreach ($pago10->xpath('descendant::pago10:DoctoRelacionado') as $doc) {
echo $doc['IdDocumento'] . '<br>';
}
echo "=========================================".PHP_EOL;
}
}
}
$ns=$xml->getnamespace(true);
$xml->registerXPathNamespace('pago10',$ns['pago10']);
if($xml->xpath('//pago10:Pagos')){
foreach($xml->xpath('//pago10:Pagos')作为$pagos10){
foreach($pagos10->xpath('genderant::pago10:Pago')作为$pago10){
foreach($pago10->xpath('genderant::pago10:DoctoRelacionado')作为$doc){
echo$doc['IdDocumento']。
;
}
echo“===================================================================”.PHP_EOL;
}
}
}
问题在于您的xpath
,因为$xml->xpath('//p:DoctoRelacionado')
将获得所有DoctoRelacionado
项目,而不仅仅是当前Pago
中的项目
相反,只有第一个foreach
应该使用xpath,其他的应该使用类似simplexmlement
的children()
方法
要解决此问题,请尝试切换以下内容的foreach
语句:
foreach ($xml->xpath('//p:Pagos') as $pagos10) {
foreach ($pagos10->children() as $pago10) {
foreach ($pago10->children() as $doc) {
echo $doc['IdDocumento'] . '<br>';
}
echo "=========================================<br>";
}
}
foreach($xml->xpath('//p:Pagos')作为$pagos10){
foreach($pagos10->children()作为$pago10){
foreach($pago10->children()作为$doc){
echo$doc['IdDocumento']。
;
}
回声“==========================================================
”;
}
}
问题在于您的xpath
,因为$xml->xpath('//p:DoctoRelacionado')
将获得所有DoctoRelacionado
项目,而不仅仅是当前Pago
中的项目
相反,只有第一个foreach
应该使用xpath,其他的应该使用类似simplexmlement
的children()
方法
要解决此问题,请尝试切换以下内容的foreach
语句:
foreach ($xml->xpath('//p:Pagos') as $pagos10) {
foreach ($pagos10->children() as $pago10) {
foreach ($pago10->children() as $doc) {
echo $doc['IdDocumento'] . '<br>';
}
echo "=========================================<br>";
}
}
foreach($xml->xpath('//p:Pagos')作为$pagos10){
foreach($pagos10->children()作为$pago10){
foreach($pago10->children()作为$doc){
echo$doc['IdDocumento']。
;
}
回声“==========================================================
”;
}
}
这非常有效,非常感谢,我不知道如何在下查找元素。这非常有效,非常感谢,我不知道如何在下查找元素。