1

有什么方法可以在我的侦听器中正确迭代一个数组,该数组包含每个 PDF 的 PDF 字节数据,并将每个数据写入一个单独的文本文件?我已经为此工作了三天,只能写第一个,仅此而已。

编辑:这是我将其剥离为的新代码:

foreach($xml->DocumentPDFs->DocumentPDF as $value) {
    $value = $value->PDFBytes;
    $binary = base64_decode($value);
    file_put_contents($xml->EnvelopeStatus->EnvelopeID . "/" . $xml->EnvelopeStatus->DocumentStatuses->DocumentStatus->Name . ".pdf", $binary);
}

我正在使用这个:

$docarr = array();
foreach($xml->DocumentPDFs as $DocumentPDFs){
    foreach ($DocumentPDFs->DocumentPDF as $DocumentPDF) {
        $docarr[] = $DocumentPDF->PDFBytes;
        foreach ($docarr as $pdfbyte) {
            $docfiles = $xml->EnvelopeStatus->EnvelopeID . "/" . $xml->EnvelopeStatus->DocumentStatuses->DocumentStatus->Name . '.txt';
            $doctxt = fopen($docfiles,"w");
            write($doctxt,$pdfbyte);
            fclose($doctxt);
        }
    }
}

出于某种原因,它一直只遍历第一个块,打印它,然后停在那里。

新编辑- 所以我只是将 XML 响应加载到 simplexml_load_file 中。这是 $xml->DocumentPDFs 上的 print_r:

SimpleXMLElement Object
(
    [DocumentPDF] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [Name] => Corporate_Information.pdf
                    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAo...
                    [DocumentType] => CONTENT
                )

            [1] => SimpleXMLElement Object
                (
                    [Name] => LLC_Information.pdf
                    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0Z...
                    [DocumentType] => CONTENT
                )

            [2] => SimpleXMLElement Object
                (
                    [Name] => Demo Document.pdf
                    [PDFBytes] => JVBERi0xLjQKJfv8/f4KNiAwIG9iago8PAovUGFyZW5...
                    [DocumentType] => CONTENT
                )

            [3] => SimpleXMLElement Object
                (
                    [Name] => CertificateOfCompletion_4b79ca0d-bbc4-4b2b-9993-295755d3b3ad.pdf
                    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago...
                    [DocumentType] => SUMMARY
                )

        )

    )

$xml->DocumentPDFs->DocumentPDF 上的 print_r:

SimpleXMLElement Object
(
    [Name] => Corporate_Information.pdf
    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAoRDoyMDEzMD...
    [DocumentType] => CONTENT
)

SimpleXMLElement Object
(
    [Name] => Corporate_Information.pdf
    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAoRDoyMD...
    [DocumentType] => CONTENT
)

SimpleXMLElement Object
(
    [Name] => Corporate_Information.pdf
    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAoRDoyMDEzMDkx...
    [DocumentType] => CONTENT
)

SimpleXMLElement Object
(
    [Name] => Corporate_Information.pdf
    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAoR...
    [DocumentType] => CONTENT
)

出于某种原因,它会正确返回 DocumentPDF,但是当我深入研究 DocumentPDF 时,它会返回基本相同的 PDF。这是为什么?

较新的编辑- 所以我只是将 foreach 调用更改为$xml->DocumentPDFs->DocumentPDF->PDFBytes as $value,对相同的项目执行 print_r ,并且 DocumentPDFs 上的打印返回相同的内容,但 DocumentPDF 上的打印返回一个对象。据我所知,我正在正确解析。

更多新编辑- 我将我的 foreach 循环更改为:

foreach($xml->DocumentPDFs as $DocumentPDFs) {
    foreach ($DocumentPDFs->DocumentPDF as $DocumentPDF) {
        foreach ($DocumentPDF->PDFBytes as $pdfbytes) {
            $binary = base64_decode($pdfbytes);
            file_put_contents($xml->EnvelopeStatus->EnvelopeID . "/" . $xml->EnvelopeStatus->DocumentStatuses->DocumentStatus->Name . ".pdf", $binary);
        }
    }
}

然后我再次打印,DocumentPDF 上的那个现在打印了正确的信息。我仍然无法让它写出所有的 PDF。有什么想法吗?

最新编辑- 所以我把它变成了一个常规数组:

$json = json_encode($xml);
$array = json_decode($json,TRUE);
foreach($array['DocumentPDFs']['DocumentPDF'] as $DocumentPDF){
    $binary = base64_decode($DocumentPDF['PDFBytes']);
    file_put_contents($xml->EnvelopeStatus->EnvelopeID . "/" . $xml->EnvelopeStatus->DocumentStatuses->DocumentStatus->Name . ".pdf", $file);
}

但它仍然只是打印最后一个 PDF。我究竟做错了什么?!

4

1 回答 1

0

在 PHP 中,foreach()循环仅适用于格式正确的数组。如果您当前正在循环:

foreach($xml->DocumentPDFs->DocumentPDF as $value) 
{
...
}

它只循环一次,这意味着:

1.  $xml->DocumentPDFs->DocumentPDF is not a valid / properly formatted array OR
2.  There is only one PDF in the given envelope (i.e. only 1 array element)

假设您正在使用包含多个 PDF 的信封进行测试,您是否已验证您正在将 xml 正确解析为 $xml 对象?在 for 循环的每次迭代期间,您可能希望在每个级别(即 DocumentPDFs、DocumentPDFs->DocumentPDF)执行一个var_dump()或,这可能会暴露问题所在。print_r()


更新

我能够使用以下 PHP 代码来实现这一点。尝试使用它,它对我有用。我现在已经注释掉了 PDFBytes,因为它会将所有数据写入输出,在取消注释之前尝试一下,看看您是否获得了唯一的文档名称和类型......

<?php
$xml = file_get_contents("PATH_TO_YOUR_XML_FILE");
$obj = new SimpleXMLElement($xml);

foreach($obj->{'DocumentPDFs'}->DocumentPDF as $value) 
{
    print_r($value->Name);
    print_r($value->DocumentType);
    //print_r($value->PDFBytes);        
}
?>
于 2013-09-19T22:18:25.707 回答