【问题标题】:PHP complex XML to JSON parsingPHP 复杂 XML 到 JSON 解析
【发布时间】:2019-08-14 12:21:46
【问题描述】:

(有人建议这个问题已经在这里得到了回答:PHP convert XML to JSON。但如下详述,我已经使用了未成功的 simplexml_load_string)。


我尝试了多种方法将 XML 文件中的内容转换为 JSON,但 XML 文件很复杂,每次尝试都会失败:

这些是我尝试过的方法:

$xml = \Zend\Xml2Json\Xml2Json::fromXml($data, false);

$doc = new \DOMDocument();
$doc->loadXML($data);
$x = $doc->documentElement;

$data = simplexml_load_string($data);

上述方法的结果:

{"Success":"true","FailMessage":{},"Returned_DataSet":{}}

我希望从结果中获取数据:

code: 47156
name: BARB
code: 1
name: GREATN
code: 89252
name: DERIN  

这是 XML:

<?xml version="1.0" encoding="utf-8"?>
<DataSetResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="https://domain.co.uk/vehicles">
  <Success>true</Success>
  <FailMessage />
  <Returned_DataSet>
    <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
      <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Table">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="CMan_Code" type="xs:int" minOccurs="0" />
                  <xs:element name="CMan_Name" type="xs:string" minOccurs="0" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
      <NewDataSet xmlns="">
        <Table diffgr:id="Table1" msdata:rowOrder="0">
          <CMan_Code>47156</CMan_Code>
          <CMan_Name>BARB                   </CMan_Name>
        </Table>
        <Table diffgr:id="Table2" msdata:rowOrder="1">
          <CMan_Code>1</CMan_Code>
          <CMan_Name>GREATN               </CMan_Name>
        </Table>
        <Table diffgr:id="Table3" msdata:rowOrder="2">
          <CMan_Code>89252</CMan_Code>
          <CMan_Name>DERIN                   </CMan_Name>
        </Table>
      </NewDataSet>
    </diffgr:diffgram>
  </Returned_DataSet>
</DataSetResult>

【问题讨论】:

  • @jay-blanchard 可以从这个问题中删除您的标记为重复并正确阅读问题。谢谢
  • 不要尝试将 XML 转换为 JSON。只需使用 Xpath 从 XML 中读取数据:3v4l.org/3bIBk
  • Paul,您询问了有多个重复项的转换。答案不是转换为 JSON。您必须承认要求转换和不使用转换来回答问题似乎是相互对立的。我正在重新打开,但这似乎更像是XY problem
  • @JayBlanchard 感谢您的回复并重新提出问题。当然,这个网站上还有其他关于解决方案的问题,但正如我所解释的那样,这些都不起作用。我假设你没有成功地让任何人工作,但如果你这样做了,我会很感激一个例子。

标签: php json xml xml-parsing


【解决方案1】:

对于更复杂的 XML,从 XML 到 JSON 的通用转换失败。 XML 具有作为附加维度的属性、具有相同名称的重复节点或混合子节点。像 JsonML 这样的基于 JSON 的格式是可能的,但这不是大多数人想要或期望的 JSON。

尝试不同的方法。使用 Xpath(和 DOM 或 SimpleXML 方法)从 XML 中读取值。根据需要构建变量/数据结构。然后,您可以将它们编码为 JSON。

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

$items = [];
// iterate the Table nodes
foreach ($xpath->evaluate('//NewDataSet/Table') as $tableNode) {
    $items[] = [
        // read CMan_Code as string 
        'code' => trim($xpath->evaluate('string(CMan_Code)', $tableNode)),
        // read CMan_Name as string 
        'name' => trim($xpath->evaluate('string(CMan_Name)', $tableNode))
    ];
}

var_dump($items);

// encode the array variable as JSON
var_dump(json_encode($items, JSON_PRETTY_PRINT));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多