PHP-从XML标记中删除前导和尾随空格

问题描述

如何删除打开和关闭XML之间的前后空格?

$sampleXML = '<?xml version="1.0" encoding="ISO-8859-1"?>  
<note>
    <PersonName>
        <Givenname> David </Givenname>
        <MiddleName> Raj</MiddleName>
        <Affix>JR</Affix>
    </PersonName>
    <Aliases>
        <PersonName>
            <Givenname></Givenname>
            <MiddleName></MiddleName>
            <FamilyName></FamilyName>
        </PersonName>
    </Aliases>
    <DemographicDetail>
        <GovernmentId countryCode="US">testIDs data  </GovernmentId>
        <DateOfBirth>2000-12-12</DateOfBirth>
    </DemographicDetail>
</note>
<anothertag>
    <data type="credit">
        <vendor score="yes"> vendor name  </vendor>
    </data>
</anothertag>';


$doc = new DOMDocument;
$doc->loadXML($xml);
foreach ($doc->documentElement->childNodes as $node) {

}
$xpath = new DOMXpath($doc);
$xml = $doc->saveXML($doc,LIBXML_NOEMPTYTAG);

我尝试使用getElementsByTagName。但是标签名称是动态的。因此,在这种情况下,它对我不起作用。

PHP类中,他们有什么想法吗?

期望的XML:

<?xml version="1.0" encoding="ISO-8859-1"?>  
<note>
    <PersonName>
        <Givenname>David</Givenname>
        <MiddleName>Raj</MiddleName>
        <Affix>JR</Affix>
    </PersonName>
    <Aliases>
        <PersonName>
            <Givenname></Givenname>
            <MiddleName></MiddleName>
            <FamilyName></FamilyName>
        </PersonName>
    </Aliases>
    <DemographicDetail>
        <GovernmentId countryCode="US">testIDs data</GovernmentId>
        <DateOfBirth>2000-12-12</DateOfBirth>
    </DemographicDetail>
</note>
<anothertag>
    <data type="credit">
        <vendor score="yes">vendor name</vendor>
    </data>
</anothertag>

谢谢。

解决方法

您可以遍历所有节点并修剪节点值,为此,您需要一个递归函数来遍历所有节点:

function trimNodes(DOMNode $node) {
  foreach ($node->childNodes as $child){
    if($child->hasChildNodes()) {
      trimNodes($child);
    } else{
      $child->nodeValue = trim($child->nodeValue);
    }
  }    
}

调用此函数并将$ doc发送给它,那么您将拥有所需的XML。 请注意,您的XML需要具有根节点。当前您有两个根节点(anothertag,请注意),将它们包装在一个根节点中。

,

如果$sampleXML只是一个字符串,那么我认为正则表达式可以为您提供所需的内容:

$pattern = '/(?<=\>)\s+(?=[a-zA-Z0-9,\.\_])|(?<=[a-zA-Z0-9,\.\_])\s+(?=\<)/';
$sampleXML = preg_replace($pattern,'',$sampleXML);