PHP — Удалить начальные и конечные пробелы из XML-тегов

#php #xml #yii

#php #xml #yii

Вопрос:

Как удалить начальный и конечный пробелы между открытым и закрывающим 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>
  

Заранее спасибо.

Ответ №1:

Вы можете выполнить обход всех узлов и обрезать значение узла, для этого вам нужна рекурсивная функция для обхода всех узлов:

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

вызовите эту функцию и отправьте ей $ doc, после чего вы получите ожидаемый XML.
Пожалуйста, обратите внимание, что ваш XML должен иметь корневой узел. В настоящее время у вас есть два корневых узла (anothertag, примечание), оберните их в один корневой узел.

Ответ №2:

Если $sampleXML это просто строка, то я думаю, что регулярное выражение могло бы дать вам то, что вы ищете:

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