简体   繁体   中英

Childnodes of CDATA section not visible in loaded xml file

I am loading an external xml file into php using simplexml. The xml contains CDATA sections of which I need the content. However, those CDATA sections have childnodes which subsequently also have CDATA sections. I also need to load those. The xml is a given fact, it's from an external source and preferably I shouldn't have to modify it.

I'm loading the XML like so:

$xml = simplexml_load_file($path, "SimpleXMLElement", LIBXML_NOCDATA);

This gives me the content of the highest CDATA sections as needed. But, the childnodes of those sections are lost.

Disabling the LIBXML_NOCDATA flag gives me access to those childnodes but not to the CDATA that's inside them.

The xml is >250000 lines, this is an excerpt of a section that is relevant to the issue:

<werkproces nr="1216607" nrvoorganger="965370" soortwijziging="Identiek" titel="Ondersteunt de cliënt bij de persoonlijke verzorging" hoofdstuk="B1-K1-W2">
  <werkprocesomschrijving><![CDATA[De beroepskracht maatschappelijke zorg ondersteunt de cliënt bij het realiseren van doelen ten aanzien van de persoonlijke lichamelijke verzorging, toiletgang, mobiliteit en het slaap/waakritme. Ze zorgt er voor dat de cliënt zo veel mogelijk zelf de regie kan voeren en naastbetrokkenen zo veel mogelijk zelf kunnen doen en vult waar nodig aan. Ze sluit hierbij aan bij de eigen kracht, mogelijkheden en beleving van de cliënt en naastbetrokkenen. Ze ondersteunt het optimaal lichamelijk en geestelijk welbevinden van de cliënt door gebruik te maken van aangepaste materialen en ruimten. Ze werkt aan het onderling vertrouwen en biedt de cliënt de mogelijkheid om persoonlijke en/of intieme vraagstukken te bespreken. Ze toont voorbeeldgedrag en biedt de cliënt mogelijkheden om vaardigheden te leren. Ze is er alert op dat gedrag veroorzaakt kan worden door fysieke problemen of ongemakken. Zij observeert en signaleert veranderingen in gedrag en gezondheid, beredeneert vervolgens welke volgende stappen genomen moeten worden en onderneemt de benodigde stappen. Ze rapporteert bijzonderheden.]]>


----------


    <werkprocesomschrijvingperprofiel><aanvullend><profiel referentie="1216566" /><omschrijving><![CDATA[De persoonlijk begeleider gehandicaptenzorg schakelt zo nodig andere disciplines in.]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216577" /><omschrijving><![CDATA[De agogisch medewerker GGZ schakelt zo nodig andere disciplines in.]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216586" /><omschrijving><![CDATA[De thuisbegeleider schakelt zo nodig andere disciplines in.]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216596" /><omschrijving><![CDATA[De persoonlijk begeleider specifieke doelgroepen schakelt zo nodig andere disciplines in.]]></omschrijving></aanvullend></werkprocesomschrijvingperprofiel>


----------


  </werkprocesomschrijving>
  <werkprocesresultaat><![CDATA[De cliënt en naastbetrokkenen zijn respectvol benaderd en hebben passende ondersteuning ontvangen bij de persoonlijke verzorging.]]><werkprocesresultaatperprofiel><aanvullend><profiel referentie="1216566" /><omschrijving><![CDATA[]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216577" /><omschrijving><![CDATA[]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216586" /><omschrijving><![CDATA[]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216596" /><omschrijving><![CDATA[]]></omschrijving></aanvullend></werkprocesresultaatperprofiel></werkprocesresultaat>
  <werkprocesgedrag><![CDATA[De beroepskracht maatschappelijke zorg:
- creëert adequaat mogelijkheden voor de cliënt om zich op het gebied van persoonlijke verzorging te ontwikkelen en doelen te bereiken;
- toont begrip voor de mening en gevoelens van de cliënt ten aanzien van zijn uiterlijk en persoonlijke hygiëne;
- gaat tijdens de persoonlijke verzorging discreet om met de privacy van de cliënt;
- voert de benodigde handelingen snel en accuraat uit volgens ergonomische voorschriften.
]]><werkprocesgedragperprofiel><aanvullend><profiel referentie="1216566" /><omschrijving><![CDATA[De persoonlijk begeleider gehandicaptenzorg:
- daagt, indien mogelijk, de cliënt uit om zelf met oplossingen te komen of (gedrags)alternatieven uit te proberen;
- motiveert naastbetrokkenen doelbewust tot haalbare activiteiten. ]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216577" /><omschrijving><![CDATA[De agogisch medewerker GGZ:
- daagt, indien mogelijk, de cliënt uit om zelf met oplossingen te komen of (gedrags)alternatieven uit te proberen;
- motiveert naastbetrokkenen doelbewust tot haalbare activiteiten. ]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216586" /><omschrijving><![CDATA[De thuisbegeleider:
- daagt, indien mogelijk, de cliënt uit om zelf met oplossingen te komen of (gedrags)alternatieven uit te proberen;
- motiveert naastbetrokkenen doelbewust tot haalbare activiteiten. ]]></omschrijving></aanvullend><aanvullend><profiel referentie="1216596" /><omschrijving><![CDATA[De persoonlijk begeleider specifieke doelgroepen:
- daagt, indien mogelijk, de cliënt uit om zelf met oplossingen te komen of (gedrags)alternatieven uit te proberen;
- motiveert naastbetrokkenen doelbewust tot haalbare activiteiten. ]]></omschrijving></aanvullend></werkprocesgedragperprofiel></werkprocesgedrag>
  <werkprocescompetenties>
    <competentie referentie="3086" />
    <competentie referentie="3087" />
    <competentie referentie="3089" />
    <competentie referentie="3094" />
    <werkprocescompetentiesperprofiel>
      <aanvullend>
        <profiel referentie="1216566" />
        <omschrijving>
          <competentie referentie="3086" />
        </omschrijving>
      </aanvullend>
      <aanvullend>
        <profiel referentie="1216577" />
        <omschrijving>
          <competentie referentie="3086" />
        </omschrijving>
      </aanvullend>
      <aanvullend>
        <profiel referentie="1216586" />
        <omschrijving>
          <competentie referentie="3086" />
        </omschrijving>
      </aanvullend>
      <aanvullend>
        <profiel referentie="1216596" />
        <omschrijving>
          <competentie referentie="3086" />
        </omschrijving>
      </aanvullend>
    </werkprocescompetentiesperprofiel>
  </werkprocescompetenties>
</werkproces>

I guess this is expected behavior from simplexml, I'm looking for a way to access these underlying CDATA sections. My current results are:

With LIBXML_CDATA flag:

"werkproces" => array:7
          0 => array:5
          1 => array:5
            "@attributs" => array:5
              "nr" => "1216607"
              "nrvoorganger" => "965370"
              "soortwijziging" => "Identiek"
              "titel" => "Ondersteunt de cliënt bij de persoonlijke verzorging"
              "hoofdstuk" => "B1-K1-W2"
            ]
            "werkprocesomschrijving" => "De beroepskracht maatschappelijke zorg ondersteunt de cliënt bij het realiseren van doelen ten aanzien van de persoonlijke lichamelijke verzorging, toiletgang, mobiliteit en het slaap/waakritme. Ze zorgt er voor dat de cliënt zo veel mogelijk zelf de regie kan voeren en naastbetrokkenen zo veel mogelijk zelf kunnen doen en vult waar nodig aan. Ze sluit hierbij aan bij de eigen kracht, mogelijkheden en beleving van de cliënt en naastbetrokkenen. Ze ondersteunt het optimaal lichamelijk en geestelijk welbevinden van de cliënt door gebruik te maken van aangepaste materialen en ruimten. Ze werkt aan het onderling vertrouwen en biedt de cliënt de mogelijkheid om persoonlijke en/of intieme vraagstukken te bespreken. Ze toont voorbeeldgedrag en biedt de cliënt mogelijkheden om vaardigheden te leren. Ze is er alert op dat gedrag veroorzaakt kan worden door fysieke problemen of ongemakken. Zij observeert en signaleert veranderingen in gedrag en gezondheid, beredeneert vervolgens welke volgende stappen genomen moeten worden en onderneemt de benodigde stappen. Ze rapporteert bijzonderheden."
            "werkprocesresultaat" => "De cliënt en naastbetrokkenen zijn respectvol benaderd en hebben passende ondersteuning ontvangen bij de persoonlijke verzorging."
            "werkprocesgedrag" => """
              De beroepskracht maatschappelijke zorg:\n
              - creëert adequaat mogelijkheden voor de cliënt om zich op het gebied van persoonlijke verzorging te ontwikkelen en doelen te bereiken;\n
              - toont begrip voor de mening en gevoelens van de cliënt ten aanzien van zijn uiterlijk en persoonlijke hygiëne;\n
              - gaat tijdens de persoonlijke verzorging discreet om met de privacy van de cliënt;\n
              - voert de benodigde handelingen snel en accuraat uit volgens ergonomische voorschriften.\n
              """
            "werkprocescompetenties" => array:2

Without de LIBXML_CDATA flag:

"werkproces" => array:7
          0 => array:5
          1 => array:5
            "@attributes" => array:5
              "nr" => "1216607"
              "nrvoorganger" => "965370"
              "soortwijziging" => "Identiek"
              "titel" => "Ondersteunt de cliënt bij de persoonlijke verzorging"
              "hoofdstuk" => "B1-K1-W2"
            ]
            "werkprocesomschrijving" => array:1
            "werkprocesresultaat" => array:1
            "werkprocesgedrag" => array:1
              "werkprocesgedragperprofiel" => array:1
                "aanvullend" => array:4
                  0 => array:2
                    "profiel" => array:1
                      "@attributes" => array:1
                        "referentie" => "1216566"
                      ]
                    ]
                    "omschrijving" => []
                  ]
                  1 => array:2
                    "profiel" => array:1
                      "@attributes" => array:1
                        "referentie" => "1216577"
                      ]
                    ]
                    "omschrijving" => []
                  ]
                  2 => array:2
                    "profiel" => array:1
                      "@attributes" => array:1
                        "referentie" => "1216586"
                      ]
                    ]
                    "omschrijving" => []
                  ]
                  3 => array:2
                    "profiel" => array:1
                      "@attributes" => array:1
                        "referentie" => "1216596"
                      ]
                    ]
                    "omschrijving" => []
                  ]
                ]
              ]
            ]
            "werkprocescompetenties" => array:2
          ]
          2 => array:5
          3 => array:5
          4 => array:5
          5 => array:5
          6 => array:5

The CDATA, and the child nodes, are not actually missing from the objects. They're just missing from anything which tries to flatten those objects, such as:

  • generic debug output like print_r , var_dump , etc
  • conversion to array, or JSON
  • live debuggers probably won't be very helpful either, as they can't show dynamic properties and methods

(Note that the opposite is true of the "@attributes" property - it doesn't exist except when flattening the object; you actually access attributes using $someElement['someAttribute'] or $someElement->attributes()->someAttribute .)

If you simply try to access the elements that you expect to exist based on viewing the XML itself, it will work fine without passing any extra options to simplexml_load_file / simplexml_load_string :

$xml = '
<sample>
    <parent>
        <![CDATA[Some text in a CDATA wrapper]]>
        <child>A child node with its own content</child>
    </parent>
</sample>
';

$sx = simplexml_load_string($xml);

echo (string)$sx->parent, PHP_EOL;
echo (string)$sx->parent->child, PHP_EOL;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM