PHP доступ к каждому дочернему элементу XML-документа - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь преобразовать xml-файл в json-файл вручную, поэтому без использования json_encode / json_decode или сохранения XML-файла в файловой системе и с использованием методов типа readFromFile.Поэтому я хочу использовать собственные модули синтаксического анализа PHP XML, циклы и синтаксический анализ массивов / коллекций для достижения этой цели.Мне удалось получить XML в строку, но как мне получить доступ к каждому дочернему элементу в файле XML ??

$string = <<<XML
<?xml version='1.0'?> 
<priip>
  <data>
    <product>
      <priipCloudProductTemplate>otc</priipCloudProductTemplate>
      <priipCloudProductType>fxSwap</priipCloudProductType>
      <productIdentifier>RBI_fxSwap_EURUSD_long_1Y2D_EUR</productIdentifier>
    </product>
    <manufacturer>
      <id>rbi</id>
      <nameLong>Raiffeisen Bank International AG</nameLong>
      <nameShort>RBI</nameShort>
      <address>Am Stadtpark 9, 1030 Wien, Austria</address>
      <telephoneNumber>+43 1 71707 0</telephoneNumber>
      <website>http://www.rbinternational.com</website>
      <email>complaints@rbinternational.com</email>
    </manufacturer>
    <document>
      <type>final</type>
    </document>
    <properties>
      <includeEarlyRedemptionInExtraordinaryEventsAlert>true</includeEarlyRedemptionInExtraordinaryEventsAlert>
    </properties>
    <tradeDate>2018-01-18</tradeDate>
    <effectiveDate>2018-01-20</effectiveDate>
    <fxSwap>
      <holder>client</holder>
      <currencyPair>EURUSD</currencyPair>
      <notionalAmount>1000000</notionalAmount>
      <notionalAmountCurrency>EUR</notionalAmountCurrency>
      <terminationDate>2019-01-20</terminationDate>
      <forwardRate>
        <value>1.25620</value>
      </forwardRate>
      <spotRate>
        <value>1.2207</value>
      </spotRate>
    </fxSwap>
    <costs>
      <entryCosts>0.0025</entryCosts>
    </costs>
    <riskMeasures version="v1.0">
      <sriRelatedValues>
        <valueAtRisk>0</valueAtRisk>
        <valueAtRiskEquivalentVolatility>0</valueAtRiskEquivalentVolatility>
        <mrm>7</mrm>
        <crm>2</crm>
        <sri>7</sri>
      </sriRelatedValues>
      <performanceScenariosRelatedValues>
        <positiveScenarioPayoutRHP>11139.633068665</positiveScenarioPayoutRHP>
        <positiveScenarioActualReturnRHP>0.1139633069</positiveScenarioActualReturnRHP>
        <positiveScenarioAverageReturnPerYearRHP>0.114276</positiveScenarioAverageReturnPerYearRHP>
        <positiveScenarioPayoutIHP1>null</positiveScenarioPayoutIHP1>            
        <stressScenarioPayoutRHP>6841.9699464563</stressScenarioPayoutRHP>
        <stressScenarioActualReturnRHP>-0.3158030054</stressScenarioActualReturnRHP>
        <stressScenarioAverageReturnPerYearRHP>-0.316671</stressScenarioAverageReturnPerYearRHP>
        <stressScenarioPayoutIHP1>null</stressScenarioPayoutIHP1>
        <stressScenarioActualReturnIHP1>null</stressScenarioActualReturnIHP1>
        <stressScenarioAverageReturnPerYearIHP1>null</stressScenarioAverageReturnPerYearIHP1>
        <stressScenarioPayoutIHP2>null</stressScenarioPayoutIHP2>
        <stressScenarioActualReturnIHP2>null</stressScenarioActualReturnIHP2>
        <stressScenarioAverageReturnPerYearIHP2>null</stressScenarioAverageReturnPerYearIHP2>
      </performanceScenariosRelatedValues>
    </riskMeasures>
    <costOutputs>
      <costsOverTime>
        <totalCostsRHP>
          <value>24.4219183409</value>
        </totalCostsRHP>
        <totalCostsIHP1>
          <value>null</value>
        </totalCostsIHP1>
        <totalCostsIHP2>
          <value>null</value>
        </totalCostsIHP2>

        <reductionInActualYieldRHP>
          <value>0.0024421918</value>
        </reductionInActualYieldRHP>
        <reductionInActualYieldIHP1>
          <value>null</value>
        </reductionInActualYieldIHP1>
        <reductionInActualYieldIHP2>
          <value>null</value>
        </reductionInActualYieldIHP2>
        <reductionInYieldRHP>
          <value>0.0024489008</value>
        </reductionInYieldRHP>
        <reductionInYieldIHP1>
          <value>null</value>
        </reductionInYieldIHP1>
        <reductionInYieldIHP2>
          <value>null</value>
        </reductionInYieldIHP2>
      </costsOverTime>
      <compositionOfCosts>
        <actualEntryCosts>
          <value>0.0024421918</value>
        </actualEntryCosts>
        <actualOtherRecurringCostsPA>
          <value>null</value>
        </actualOtherRecurringCostsPA>
        <actualExitCosts>
          <value>0</value>
        </actualExitCosts>
        <entryCosts>
          <value>0.0024489008</value>
        </entryCosts>
        <otherRecurringCostsPA>
          <value>null</value>
        </otherRecurringCostsPA>
        <exitCosts>
          <value>0</value>
        </exitCosts>
      </compositionOfCosts>
    </costOutputs>
  </data>
</priip>    
XML;

$xml = simplexml_load_string($string);
print_r($xml);

Я пытался использовать эту функцию

$xml=simplexml_load_string($string);
foreach ($xml->children() as $child){
  echo "Child node: " . $child . "<br>";
}

, но это нене работает

@ Мухаммед @rokoko Мне даже интересно, если вы один и тот же человек. Почти та же проблема.

1 Ответ

0 голосов
/ 27 сентября 2018

Используйте xpath() для выбора элемента с XPath.* выбрать все теги в документе.

$xml = simplexml_load_string($string);
foreach ($xml->xpath('//*') as $node){    
    // $node is element
}

Результат проверки в demo

...