【问题标题】:how to remove white space between xml tags如何去除xml标签之间的空白
【发布时间】:2018-09-08 11:28:27
【问题描述】:

我有一个 xml 文件,当我使用 DOMDocument:: 加载此文件时,加载并保存它会产生空白,请建议如何删除此空白。下面是我的代码。

    $file = 'myfile.xml' 
    $doc = new DOMDocument('1.0', 'utf-8');
    $doc->preserveWhiteSpace = false;
    $doc->load($file);
    echo htmlentities($doc->saveXML());exit;

它给出这样的输出

<?xml version="1.0"?> <Esign ver="2.0"></Esign>

如何删除这个空间

实际上我正在尝试执行数字签名 下面是我的数字签名函数,在这个函数中,我发现在 $doc->load($file)

之后添加了空间
public function digital_sign($file){

    $doc = new DOMDocument('1.0', 'utf-8');
    $doc->preserveWhiteSpace = false;

    $doc->load($file);

    // Create a new Security object
    $objDSig = new XMLSecurityDSig();
    // Use the c14n exclusive canonicalization
    $objDSig->setCanonicalMethod(XMLSecurityDSig::C14N_COMMENTS);
    // Sign using SHA-256
    $objDSig->addReference($doc,XMLSecurityDSig::SHA256,array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'),array('force_uri'=>'true'));

    // Create a new (private) Security key
    $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA256, array('type'=>'private'));
    // Load the private key
    $objKey->loadKey('private_key.pem', TRUE);

    $objDSig->sign($objKey);

    // Add the associated public key to the signature
    $options['subjectName'] = "true";
    $objDSig->add509Cert(file_get_contents('public_key.cer'),true,false,$options);

    // Append the signature to the XML
    $objDSig->appendSignature($doc->documentElement);

    $filenewpath = 'newfile1.xml';
    ob_clean();

    if($doc->save($filenewpath)){
      return true;
    }
  }

$file 包含下面的 xml

<Esign ver="2.0" sc="Y" ts="2018-03-30T07:10:47" txn="97051198" ekycMode="U" ekycId="88XXXXXXXXX" ekycIdType="A" aspId="ASPSXXXXXXXXXXX156" AuthMode="1" responseSigType="pkcs7" preVerified="n" organizationFlag="n" responseUrl="https://www.google.com"><Docs><InputHash id="1" hashAlgorithm="SHA256" docInfo="Test pdf">60bdd13ea4827b8de375c79dc3ff847f83b55bd73b6461523fdf8f843b5a0d5b</InputHash></Docs></Esign>

签名后输出

<?xml version="1.0"?> <Esign ver="2.0" sc="Y" ts="2018-03-30T07:21:03" txn="39242002" ekycMode="U" ekycId="88XXXXXXXXX" ekycIdType="A" aspId="ASPSXXXXXXXXXXX156" AuthMode="1" responseSigType="pkcs7" preVerified="n" organizationFlag="n" responseUrl="https://www.stage.kissht.com/welcome/email"><Docs><InputHash id="1" hashAlgorithm="SHA256" docInfo="Test pdf">60bdd13ea4827b8de375c79dc3ff847f83b55bd73b6461523fdf8f843b5a0d5b</InputHash></Docs><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>bstOvGSSvkuEcriLXk6Qj2nhzEb3BZ1oEUtOYoMFyCw=</DigestValue></Reference></SignedInfo><SignatureValue>Uj3aSvmbMhUJX5Bwj3Bk3/F5U6IFx4LMS1BWMLTeEtnMvcfrJo25YGZHQtt1CnPbT5ygKEU7dQ3IBRsghqDvG+VAHYbU9gfX1N/5NxLM15oGWhZ3oSlNv7ouS1Ajzvaiei/OTr83jlUVfTW/MftYo/z6wYFdZp6Gc+0Fp38RLTzYPLr0l34NN/dIBy5/+FDYc9yTJrkwqj4SEQelmt0mzbV2jMo1/Nbvf+BLJq4+QMBoqjCiAlqcqc2/xX6K1xlUrPRwy6FC7ymFMBth0+9HJ6KLIwO+8Q+iUZgj3YFQdry1YGVDF1YNSTo5YcJcqrXycLFjTK2PDFcJ4rJg56IaXA==</SignatureValue><KeyInfo><X509Data><X509SubjectName>CN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</X509SubjectName><X509Certificate>MIIGCDCCBPCgAwIBAgIEANFsFzANBgkqhkiG9w0BAQsFADCBkzELMAkGA1UEBhMCSU4xKjAoBgNVBAoTIWVNdWRocmEgQ29uc3VtZXIgU2VydmljZXMgTGltaXRlZDEdMBsGA1UECxMUQ2VydGlmeWluZyBBdXRob3JpdHkxOTA3BgNVBAMTMGUtTXVkaHJhIFN1YiBDQSBDbGFzcyAyIGZvciBEb2N1bWVudCBTaWduZXIgMjAxNDAeFw0xNzAyMjEwOTMwMjhaFw0xOTAyMjEwOTMwMjhaMIHwMQswCQYDVQQGEwJJTjEyMDAGA1UEChMpU0kgQ1JFVkEgQ0FQSVRBTCBTRVJWSUNFUyBQUklWQVRFIExJTUlURUQxCzAJBgNVBAsTAklUMQ8wDQYDVQQREwY0MDAwMTIxFDASBgNVBAgTC01BSEFSQVNIVFJBMQ8wDQYDVQQJEwZNVU1CQUkxNzA1BgNVBDMTLjIwMiAyMDMgUEVOSU5TVUxBIENFTlRSRSBEUiBTIFMgUkFPIFJPQUQgUEFSRUwxLzAtBgNVBAMTJkRTIFNJIENSRVZBIENBUElUQUwgU0VSVklDRVMgUFJJVkFURSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsi9KF+7r6qBvsM27zlyYqQHXw867koX3CNNw4onRPSoxFEv1yThaYSA5MUFp5OQlq7/wKWWhKh842BVRJ7ov7iLSUXHSEmvbw70czribN3Ps9xXnOeHT+REchBeshttjdaZ7NTMyITVPcL6rzZ3Z8FT1ce9vtl4akls9ghXRRBTatzP/QKztLcxyB7RkGXV+tESeAhPqnP9RsHbGLRCQdIo9yEc4nJxDvuItxdTs/BcUTLpxeYaUlYYhXAeMWmHMsm5EtGH6eTyG3kWyaFyQF2aMdwGALxaHHie/OtLWm5w1tecOfpymO6uhlC6dfzhQTBwgHJGw/8P+wSK7gQnQbfG3zSQiGJn2vjy9sHTbmJoLcOc5ZhyhaWSMymTepXKwXpI</X509Certificate></X509Data></KeyInfo></Signature></Esign>

如何删除这个空间

<?xml version="1.0"?> <Esign

【问题讨论】:

  • 尝试在htmlentitites中使用ENT_SUBSTITUTE标志,检查是否只有空格,可以是其他符号unicode
  • 我试过但什么也没得到,甚至试图将输出保存在一个文件中,得到相同的带有空格的 xml。

标签: php xml xml-parsing xmlhttprequest digital-signature


【解决方案1】:

saveXML() 函数在&lt;?xml ?&gt; 标记之后创建一个换行符。在 HTML 环境中显示,您会看到一个“空格”。

您可以使用str_replace() 删除此"\n",然后再使用htmlentities() 处理此特定情况:

$file = 'myfile.xml';
$doc = new DOMDocument('1.0', 'utf-8');
$doc->preserveWhiteSpace = false;
$doc->load($file);
$xml = $doc->saveXML();
$xml = str_replace("?>\n<", '?><', $xml);
// $xml = str_replace("?>".PHP_EOL."<", '?><', $xml);
// $xml = preg_replace("~\?>\s+<~", '?><', $xml);
echo htmlentities($xml);
exit;

将输出:

<?xml version="1.0"?><Esign ver="2.0"></Esign>

【讨论】:

  • 我也尝试使用 $doc->save(file.xml) 将输出保存在文件中,但在文件中得到相同的输出
  • @codex 我已经更新了删除多个空格的答案。
  • @codex 您能否提供您的 XML 源代码的相关部分和您的预期输出?谢谢。
  • 可以尝试str_replace(PHP_EOL, '', $doc-&gt;saveXML());,因为这不会受到“新行”的平台特定编码的影响。
  • 不应该将echo htmlentities($doc-&gt;saveXML()); 替换为echo htmlentities($xml); 吗?否则,您将再次重新生成行尾/空格...`