【问题标题】:Getting xml elements by tag name通过标签名称获取 xml 元素
【发布时间】:2019-05-05 13:53:31
【问题描述】:

我在这里看到了几乎所有关于这个问题的问题,但没有一个是相关的。

$employees = simplexml_load_string($response)->c->q[1]['v'];

$employees = SimpleXML 对象:

<?xml version="1.0" encoding="utf-8" ?>
<rows xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "Articles_Schema.xsd" >
    <row id="1">
        <EmployeeID>
            <![CDATA[123]]>
        </EmployeeID>
        <EmplopyeeName>
            <![CDATA[John Doe]]>
        </EmplopyeeName>
    </row>
    <row id="2">
       <EmployeeID>
            <![CDATA[456]]>
        </EmployeeID>
        <EmplopyeeName>
            <![CDATA[Jack Mill]]>
        </EmplopyeeName>
    </row>
</rows>

我想检索所有员工(如果找到)。

我尝试使用以下方式访问它们:

  1. $employees-&gt;children() [空数组]
  2. $employees-&gt;rows [空数组]
  3. $employees-&gt;row [空数组]
  4. $employees-&gt;xpath('//rows') [空数组]
  5. $employees-&gt;xpath('//row') [空数组]
  6. $employees-&gt;registerXPathNamespace('x', 'http://www.w3.org/2001/XMLSchema-instance'); $employees-&gt;xpath('//x:row') [空数组]

var_dump($employees-&gt;getName()); //returns "v"

var_dump($employees-&gt;getNamespaces()); //returns NULL

var_dump($employees); 返回:

object(SimpleXMLElement)#26 (1) {
  [0]=>
  string(xxx) "
<?xml version="1.0" encoding="utf-8" ?>
    <rows xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "Articles_Schema.xsd" >
        <row id="1">
            <EmployeeID>
                <![CDATA[123]]>
            </EmployeeID>
            <EmplopyeeName>
                <![CDATA[John Doe]]>
            </EmplopyeeName>
        </row>
        <row id="2">
           <EmployeeID>
                <![CDATA[456]]>
            </EmployeeID>
            <EmplopyeeName>
                <![CDATA[Jack Mill]]>
            </EmplopyeeName>
        </row>
    </rows>"
}

有人能指出导致问题的原因吗?

【问题讨论】:

    标签: php xml simplexml xml-namespaces


    【解决方案1】:

    这对我有用:

    <?php
    
    $employees =<<< EMP
    <?xml version="1.0" encoding="utf-8" ?>
    <rows xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "Articles_Schema.xsd" >
        <row id="1">
            <EmployeeID>
                <![CDATA[123]]>
            </EmployeeID>
            <EmplopyeeName>
                <![CDATA[John Doe]]>
            </EmplopyeeName>
        </row>
        <row id="2">
           <EmployeeID>
                <![CDATA[456]]>
            </EmployeeID>
            <EmplopyeeName>
                <![CDATA[Jack Mill]]>
            </EmplopyeeName>
        </row>
    </rows>
    EMP;
    
    $employees = simplexml_load_string($employees);
    foreach($employees->row as $row)
    {
       print((string) $row->EmployeeID);
       print((string) $row->EmplopyeeName);
    }
    

    为您的情况尝试的东西:

    $employeeXml = simplexml_load_string((string) $employees);
    foreach($employeeXml->row as $row)
    {
       print((string) $row->EmployeeID);
       print((string) $row->EmplopyeeName);
    }
    

    【讨论】:

    • 就我而言:var_dump($employees-&gt;row); //returns object(SimpleXMLElement)#26 (0) { }
    • Employees 最初是从 API Response 返回的 ===> $employees = simplexml_load_string($response)-&gt;c-&gt;q[1]['v'];
    【解决方案2】:

    你可以这样处理

    $xml = <<< EMP
    <?xml version="1.0" encoding="utf-8" ?>
    <rows xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "Articles_Schema.xsd" >
    <row id="1">
        <EmployeeID>
            <![CDATA[123]]>
        </EmployeeID>
        <EmplopyeeName>
            <![CDATA[John Doe]]>
        </EmplopyeeName>
    </row>
     <row id="2">
       <EmployeeID>
            <![CDATA[456]]>
        </EmployeeID>
        <EmplopyeeName>
            <![CDATA[Jack Mill]]>
        </EmplopyeeName>
     </row>
    </rows>
    EMP;
    $xmlToArray = json_decode(json_encode((array)simplexml_load_string($xml,null,LIBXML_NOCDATA)),true);
    foreach($xmlToArray['row'] as $row){
     echo trim($row['EmployeeID']).'---'.trim($row['EmplopyeeName']);
    }
    

    DEMO LINK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      相关资源
      最近更新 更多