【问题标题】:Traversing simplexml_load_file and sending each element node through cURL遍历simplexml_load_file并通过cURL发送每个元素节点
【发布时间】:2015-09-03 04:23:29
【问题描述】:

在我的 test.xml 文件中,我有多个 Field 节点,如下所示:

<?xml version="1.0" encoding="iso-8859-1"?>
<Fields>
  <Field>
    <ID>01258</ID>
    <Name>abc</Name>
    <Contact>Contact One</Contact>
  </Field>
  <Field>
    <ID>52458</ID>
    <Name>def</Name>
    <Contact>Contact Two</Contact>
  </Field>
  <Field>
    <ID>74287</ID>
    <Name>xyz</Name>
    <Contact>Contact Three</Contact>
  </Field>
</Fields>

我想通过 cURL 将每个 Field 节点一次发送一个到 API。这就是我在我的 PHP 中所做的:

<?php
$inputFilename = 'test.xml';
$url = 'http://api-url......' // API URL

$xml = simplexml_load_file($inputFilename);
foreach($xml->Field as $field) {
  $input_xml = '<Field>'.$field.'</Field>';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $input_xml);
  curl_setopt($ch, CURLOPT_TIMEOUT, 50);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
}

现在我有一个问题。 $input_xml 似乎没有保存正确的 xml。当我运行这段代码时,我得到了这个错误:

XML Parsing Error: junk after document element
.....
Line Number 10, Column 8:   
        </Field><Field>
  --------------^

我该如何解决这个问题?如何确保$field 实际输出的是 xml?

【问题讨论】:

  • 使用 var_dump 检查 $field 是什么。您可能必须将其转换为$field = (string)$field; 之类的字符串

标签: php xml curl


【解决方案1】:

尝试使用可以正确找到所有字段的 DOMXPath

$doc = new DOMDocument("1.0", "utf-8");
$doc->loadXML(file_get_contents($inputFilename));

$xpath = new DOMXPath($doc);
$field = $xpath->query("/fields/field");
foreach ($fields as $field)
  {
     $field->ownerDocument;
  }

你甚至不使用 simplexml_load_file 和 $input_xml = '&lt;Field&gt;'.$field.'&lt;/Field&gt;';

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多