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

PHP - Remove leading and trailing spaces from XML tags

如何去除开始和结束 XML 之间的前导和尾随白色 space?

$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 class 中有任何构建吗?

预期 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>

提前致谢。

可以遍历所有节点,trim节点值,为此需要一个递归函数遍历所有节点:

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);