How to parse this XML(XBRL) using Php

 ̄綄美尐妖づ 提交于 2019-12-11 05:45:26

问题


I am new to PHP and I need to parse an XML file, make some changes in it and write it.

The file looks like this:

<xbrli:xbrl xsi:schemaLocation="http://xbrl.org/2006/xbrldi http://www.xbrl.org/2006/xbrldi-2006.xsd"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:odrpt.0001.list.req.02.00="http://sbr.gov.au/rprt/ato/odrpt/odrpt.0001.list.request.02.00.report"
                    xmlns:ref="http://www.xbrl.org/2006/ref"
                    xmlns:dtyp.02.24="http://sbr.gov.au/fdtn/sbr.02.24.dtyp"
                    xmlns:pyid.02.10="http://sbr.gov.au/icls/py/pyid/pyid.02.10.data"
                    xmlns:emsup.02.08="http://sbr.gov.au/icls/em/emsup/emsup.02.08.data"
                    xmlns:emsup.02.20="http://sbr.gov.au/icls/em/emsup/emsup.02.20.data"
                    xmlns:xbrldt="http://xbrl.org/2005/xbrldt"
                    xmlns:SqNumDim.02.01_typedelement="http://sbr.gov.au/dims/SqNumDim.02.01.dims"
                    xmlns:pyde.02.20="http://sbr.gov.au/icls/py/pyde/pyde.02.20.data"
                    xmlns:dtyp.02.00="http://sbr.gov.au/fdtn/sbr.02.00.dtyp"
                    xmlns:pyid.02.00="http://sbr.gov.au/icls/py/pyid/pyid.02.00.data"
                    xmlns:link="http://www.xbrl.org/2003/linkbase"
                    xmlns:xlink="http://www.w3.org/1999/xlink"
                    xmlns:odrpt.0001.prv.02.00="http://sbr.gov.au/rprt/ato/odrpt/odrpt.0001.private.02.00.module"
                    xmlns:iso4217="http://www.xbrl.org/2003/iso4217"
                    xmlns:pyde.02.00="http://sbr.gov.au/icls/py/pyde/pyde.02.00.data"
                    xmlns:pyde.02.08="http://sbr.gov.au/icls/py/pyde/pyde.02.08.data"
                    xmlns:tech.01.02="http://sbr.gov.au/fdtn/sbr.01.02.tech"
                    xmlns:xbrldi="http://xbrl.org/2006/xbrldi"
                    xmlns:RprtPyType.02.13="http://sbr.gov.au/dims/RprtPyType.02.13.dims"
                    xmlns:tech.01.03="http://sbr.gov.au/fdtn/sbr.01.03.tech"
                    xmlns:xbrli="http://www.xbrl.org/2003/instance"
                    xmlns:pyin.02.02="http://sbr.gov.au/icls/py/pyin/pyin.02.02.data"
                    xmlns:pyde.02.12="http://sbr.gov.au/icls/py/pyde/pyde.02.12.data"
                    xmlns:pyid.02.03="http://sbr.gov.au/icls/py/pyid/pyid.02.03.data">
                    <link:schemaRef xlink:type="simple" xlink:href="http://sbr.gov.au/taxonomy/sbr_au_reports/ato/usmat/usmat_0001/usmat.0001.list.request.02.00.report.xsd"/>
                    <xbrli:context id="Context_Duration_ReportingParty">
                        <xbrli:entity>
                            <xbrli:identifier scheme="http://www.abr.gov.au/abn">111111111</xbrli:identifier>
                            <xbrli:segment>
                                <xbrldi:explicitMember dimension="RprtPyType.02.13:ReportPartyTypeDimension">RprtPyType.02.13:ReportingParty</xbrldi:explicitMember>
                            </xbrli:segment>
                        </xbrli:entity>
                        <xbrli:period>
                            <xbrli:startDate>2014-06-01</xbrli:startDate>
                            <xbrli:endDate>2014-06-01</xbrli:endDate>
                        </xbrli:period>
                    </xbrli:context>
                    <xbrli:context id="Context_Duration_SuperFundMember">
                        <xbrli:entity>
                            <xbrli:identifier scheme="http://www.ato.gov.au/tfn">11111111</xbrli:identifier>
                            <xbrli:segment>
                                <xbrldi:explicitMember dimension="RprtPyType.02.13:ReportPartyTypeDimension">RprtPyType.02.13:SuperFundMember</xbrldi:explicitMember>
                            </xbrli:segment>
                        </xbrli:entity>
                        <xbrli:period>
                            <xbrli:startDate>2015-06-01</xbrli:startDate>
                            <xbrli:endDate>2014-06-01</xbrli:endDate>
                        </xbrli:period>
                    </xbrli:context>
                    <pyde.02.00:OrganisationNameDetails.OrganisationalName.Text contextRef="Context_Duration_ReportingParty">CCCorp</pyde.02.00:OrganisationNameDetails.OrganisationalName.Text>
                    <pyde.02.00:PersonNameDetails.FamilyName.Text contextRef="Context_Duration_SuperFundMember">CC</pyde.02.00:PersonNameDetails.FamilyName.Text>
                    <pyde.02.00:PersonNameDetails.GivenName.Text contextRef="Context_Duration_SuperFundMember">CC</pyde.02.00:PersonNameDetails.GivenName.Text>
                    <pyde.02.00:PersonNameDetails.OtherGivenName.Text contextRef="Context_Duration_SuperFundMember">CC</pyde.02.00:PersonNameDetails.OtherGivenName.Text>
                    <pyde.02.12:PersonDemographicDetails.Birth.DayofMonth contextRef="Context_Duration_SuperFundMember">---18</pyde.02.12:PersonDemographicDetails.Birth.DayofMonth>
                    <pyde.02.12:PersonDemographicDetails.Birth.Month contextRef="Context_Duration_SuperFundMember">--12</pyde.02.12:PersonDemographicDetails.Birth.Month>
                    <pyde.02.12:PersonDemographicDetails.Birth.Year contextRef="Context_Duration_SuperFundMember">1960</pyde.02.12:PersonDemographicDetails.Birth.Year>
                    <pyid.02.10:Identifiers.SuperannuationMemberAccount.Identifier contextRef="Context_Duration_SuperFundMember">true</pyid.02.10:Identifiers.SuperannuationMemberAccount.Identifier>
                    <pyde.02.00:AddressDetails.Line1.Text contextRef="Context_Duration_SuperFundMember">CC</pyde.02.00:AddressDetails.Line1.Text>
                    <pyde.02.00:AddressDetails.Line2.Text contextRef="Context_Duration_SuperFundMember">CC</pyde.02.00:AddressDetails.Line2.Text>
                    <pyde.02.00:AddressDetails.LocalityName.Text contextRef="Context_Duration_SuperFundMember">CC</pyde.02.00:AddressDetails.LocalityName.Text>
                    <pyde.02.00:AddressDetails.Postcode.Text contextRef="Context_Duration_SuperFundMember">3350</pyde.02.00:AddressDetails.Postcode.Text>
                    <pyde.02.00:AddressDetails.StateOrTerritory.Code contextRef="Context_Duration_SuperFundMember">CC</pyde.02.00:AddressDetails.StateOrTerritory.Code>
                    <pyde.02.08:AddressDetails.Country.Code contextRef="Context_Duration_SuperFundMember">au</pyde.02.08:AddressDetails.Country.Code>
                    <emsup.02.08:SuperannuationFundDetails.UniqueSuperannuationIdentifier.Identifier contextRef="Context_Duration_SuperFundMember">abc1234ab</emsup.02.08:SuperannuationFundDetails.UniqueSuperannuationIdentifier.Identifier>
                </xbrli:xbrl>

You can view it here: https://codebeautify.org/xmlviewer/cbfe5ebd

I have tried DOM parser using some example, But i can't parse fields like :

<pyde.02.00:AddressDetails.Postcode.Text>

Let me know if any other information is required.


回答1:


Use Following code:

       $xmldoc = new DOMDocument();
            $xmldoc->load("myFile.xml");
            $xpath = new DOMXPath($xmldoc);
            $xpath->registerNamespace("xbrli",  "http://www.xbrl.org/2003/instance");
            $xpath->registerNamespace("pyde.02.00", "http://sbr.gov.au/icls/py/pyde/pyde.02.00.data");

            $organizationNameList = $xpath->query("/xbrli:xbrl/pyde.02.00:OrganisationNameDetails.OrganisationalName.Text[@contextRef='    Context_Duration_ReportingParty']");
            if($organizationNameList->length != 0){
                $orgNode = $organizationNameList->item(0);
                $orgName = $organizationNameList->length === 1 ? $organizationNameList->item(0)->nodeValue : null;
                echo $orgName;
            }

Using following code I am Able to read a value using specific query




回答2:


If you load the data using something like simplexml_load_string then the following will do the job...

    $xml = simplexml_load_string( '
            <xbrli:xbrl xsi:schemaLocation="http://xbrl.org/2006/xbrldi http://www.xbrl.org/2006/xbrldi-2006.xsd"
                       ... 
            </xbrli:xbrl>
');


foreach($xml->xpath('//pyde.02.00:AddressDetails.Postcode.Text') as $postCode) {
    print_r($postCode);
}

You will need to add in the rest of the XML document, but this is just to show the main code as opposed to re-listing the whole xml. The main thing is the XPath, which you can see has the namespace (pyde.02.00) as well as the elements name to locate the particular bit your after. You should then be able to process these elements with your own code.

Edit: To modify values, you need to change the corresponding part of the element. So above prints out...

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [contextRef] => Context_Duration_SuperFundMember
        )

    [0] => 3350
)

So if in the code you do

$postCode = $xml->xpath('//pyde.02.00:AddressDetails.Postcode.Text')[0];
$postCode[0] = "3351";

This results in the element now being

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [contextRef] => Context_Duration_SuperFundMember
        )

    [0] => 3351
)

If you want to save this to a file, then

$xml->asXml( $fileName );


来源:https://stackoverflow.com/questions/44845538/how-to-parse-this-xmlxbrl-using-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!