我需要自定义xml标签

时间:2019-10-01 10:41:46

标签: php xml

我需要对我使用的xml标签进行一些更改。我需要在其他标签中收集其中一些标签。 例如:

<image> image_url </image>
the tags
<Images>
    <Image> image_url <image>
</Images>

必须

我可能还需要在现有标签下方或上方使用一些标签

例如:

<productname> pr_name </productname>
<newproductname> pr_name </newproductname>

测试xml输出:

<Root>
  <Products>
    <Product>
        <productname> pr_name </productname>
        <price> pr_price </price>
        <sku> pr_sku </sku>
        <Image> image_url <image>
    <Product>
  </Products>
</Root>

我要这样:)

<Root>
  <Products>
    <Product>
        <newproductname> pr_name </newproductname>

        <productname> pr_name </productname>
        <price> pr_price </price>
        <sku> pr_sku </sku>
        <Images>
            <Image> image_url <image>
        </Images>

        <newsku> pr_newsku </newsku>
    <Product>
  </Products>
</Root>

如何更改我喜欢的结构

header('Content-Type: application/xml');
$xml = new DOMDocument();
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;
$xml->load('test.xml');
$xml_string = $xml->saveXML();
echo $xml_string;

1 个答案:

答案 0 :(得分:0)

鉴于下面的示例XML(基于问题中引用的XML,但已进行了稍微扩展并纠正了格式错误的XML,如上所示),可以通过小心使用DOMXPath和{{ 1}}-对后者稍作改动即可实际执行insertBefore

insertAfter

调试打印(以上$xml='<?xml version="1.0" encoding="UTF-8"?> <Root> <Products> <Product> <productname> pr_name 1</productname> <price> pr_price 1</price> <sku> pr_sku 1</sku> <Image> image_url 1.1</Image> <Image> image_url 1.2</Image> </Product> <Product> <productname> pr_name 2</productname> <price> pr_price 2</price> <sku> pr_sku 2</sku> <Image> image_url 2</Image> </Product> <Product> <productname> pr_name 3</productname> <price> pr_price 3</price> <sku> pr_sku 3</sku> <Image> image_url 3.1</Image> <Image> image_url 3.2</Image> <Image> image_url 3.3</Image> </Product> <Product> <productname> pr_name 4</productname> <price> pr_price 4</price> <sku> pr_sku 4</sku> </Product> </Products> </Root>'; $dom=new DOMDocument('1.0','utf-8'); $dom->formatOutput=true; $dom->validateOnParse=false; $dom->recover=true; $dom->strictErrorChecking=false; $dom->preserveWhiteSpace=false; $dom->loadXML( $xml ); $errors = libxml_get_errors(); libxml_clear_errors(); $xp=new DOMXPath( $dom ); $col=$xp->query( '//Products/Product' ); if( $col->length > 0 ){ foreach( $col as $node ){ /* Get the `productname` and create a new element before with same value */ $productname=$xp->query( 'productname', $node )->item(0); $newproductname=$dom->createElement( 'newproductname', $productname->textContent ); $node->insertBefore( $newproductname, $productname ); /* Find all the Image tags within parent */ $ref=$xp->query( 'Image', $node ); /* determine reference node to use for `insertBefore` */ if( $ref && $ref->length > 0 )$refNode=$ref->item(0); else $refNode=$node->lastChild; /* create a new `Images` node */ $oImages=$dom->createElement('Images'); $node->insertBefore( $oImages, $refNode ); /* using previously discovered `Image` nodes, add to the new `Images` element */ foreach( $ref as $img )$oImages->appendChild( $img ); } } /* for demo display */ printf('<pre>%s</pre>',print_r( htmlentities( $dom->saveXML() ), true ) ); /* For real output */ #header( 'Content-Type: application/xml' ); #exit( $dom->saveXML() ); )的输出如下,我相信,除了上面显示的未提及的printf标记之外,所需的输出格式也是如此:

newsku