使用StartTag从php中的Ruby脚本解析xml:无效的元素名称< / Envelope>

时间:2016-10-01 16:57:45

标签: php ruby xml xml-parsing

我有一个Ruby脚本,它对.NET ASP服务器进行查询,并将结果作为XML字符串获取;

<?xml version="1.0" encoding="utf-8"?>
<Envelope>
  <Body>
    <QueryServicesResponse>
      <QueryServicesResult>
        <Date>2016-01-01</Date>
        <serviceList>
          <service>
            <uuid>10264b70-87ee-11e6-ae22-56b6b6499611</uuid>
            <flight>EZY0000</flight>
            <originName>London Heathrow</originName>
            <originShort>LHR</originShort>
            <destinationName>London Stansted</destinationName>
            <destinationShort>STN</destinationShort>
            <scheduledDeparture>2016-01-01T14:00:00</scheduledDeparture>
            <scheduledArrival>2016-01-01T14:30:00</scheduledArrival>
          </service>
        </serviceList>
      </QueryServicesResult>
    </QueryServicesResponse>
  </Body>
</Envelope>

这是处理返回正文的ruby脚本部分;

# Post the request
resp, data = http.post(path, data, headers)

# Output the results
doc = Nokogiri::XML(resp.body)
doc.remove_namespaces!
puts doc

通过带有以下代码的php文件调用ruby脚本;

<?php
$xml = exec("ruby test.rb EZY0000",($results));

$xmlparse = simplexml_load_string($xml);
    echo $xmlparse;
?>

但是php在尝试解析结果时会引发以下错误;

  

PHP Warning: simplexml_load_string(): Entity: line 1: parser error : StartTag: invalid element name   PHP Warning: simplexml_load_string(): &lt;/Envelope&gt;

我试图将xml解析成SimpleXMLElement Object我过去几天一直在尝试各种各样的事情,但现在却陷入困境或对此问题视而不见。我试过htmlspecialchars,但这也没有帮助。

我唯一能想到的是这与来自ruby脚本的字符串有关,即使它看起来像是正确的xml。

如果我使用上面的xml并使用以下php代码,那么一切都按预期工作,我得到了所需的结果;

<?php
$string = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<Envelope>
  <Body>
    <QueryServicesResponse>
      <QueryServicesResult>
        <Date>2016-01-01</Date>
        <serviceList>
          <service>
            <uuid>10264b70-87ee-11e6-ae22-56b6b6499611</uuid>
            <flight>EZY0000</flight>
            <originName>London Heathrow</originName>
            <originShort>LHR</originShort>
            <destinationName>London Stansted</destinationName>
            <destinationShort>STN</destinationShort>
            <scheduledDeparture>2016-01-01T14:00:00</scheduledDeparture>
            <scheduledArrival>2016-01-01T14:30:00</scheduledArrival>
          </service>
        </serviceList>
      </QueryServicesResult>
    </QueryServicesResponse>
  </Body>
</Envelope>
XML;

$xml = simplexml_load_string($string);

print_r($xml);
?>

哪个给了我;

SimpleXMLElement Object
(
    [Body] => SimpleXMLElement Object
        (
            [QueryServicesResponse] => SimpleXMLElement Object
                (
                    [QueryServicesResult] => SimpleXMLElement Object
                        (
                            [Date] => 2016-01-01
                            [serviceList] => SimpleXMLElement Object
                                (
                                    [service] => SimpleXMLElement Object
                                        (
                                            [uuid] => 10264b70-87ee-11e6-ae22-56b6b6499611
                                            [flight] => EZY0000
                                            [originName] => London Heathrow
                                            [originShort] => LHR
                                            [destinationName] => London Stansted
                                            [destinationShort] => STN
                                            [scheduledDeparture] => 2016-01-01T14:00:00
                                            [scheduledArrival] => 2016-01-01T14:30:00
                                        )
                                )
                        )
                )
        )
)

那么如何从我的ruby脚本中获取xml到一个我可以在php中操作的有效对象? Someome离线说我应该尝试在Rails中完成所有工作 - 但我还没有准备好迎接目前这么多挑战。

1 个答案:

答案 0 :(得分:0)

因此,在@slowjack2k的提示下,我重新查看了生成响应的Ruby文件。

doc = Nokogiri::XML(resp.body)我将其更改为doc = Nokogiri::HTML(resp.body)并且显示为低并且看到它现在正常工作并按预期在php中返回有效的xml对象。