Как разобрать этот XML (XBRL), используя Php

Я новичок в PHP, и мне нужно проанализировать XML-файл, внести в него некоторые изменения и написать его.

Файл выглядит следующим образом:

<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> 

Вы можете просмотреть его здесь: https://codebeautify.org/xmlviewer/cbfe5ebd

Я попробовал парсер DOM, используя некоторый пример, но я не могу анализировать такие поля, как:

 <pyde.02.00:AddressDetails.Postcode.Text> 

Сообщите мне, требуется ли какая-либо другая информация.

Если вы загружаете данные с помощью чего-то вроде simplexml_load_string то следующее будет выполняться …

  $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); } 

Вам нужно будет добавить остальную часть документа XML, но это всего лишь показать основной код, а не переименовать весь xml. Главное – XPath, который вы видите, имеет пространство имен (pyde.02.00), а также имя элемента, чтобы найти конкретный бит после. Затем вы должны обработать эти элементы с помощью своего собственного кода.

Изменить: для изменения значений вам необходимо изменить соответствующую часть элемента. Таким образом, выше печатает …

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

Поэтому, если в коде, который вы делаете

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

Это приводит к тому, что теперь элемент

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

Если вы хотите сохранить это в файл, тогда

 $xml->asXml( $fileName ); 

Использовать следующий код:

  $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; } 

Используя следующий код, я могу прочитать значение, используя конкретный запрос