Question
· Oct 6, 2023

Parcours de noeuds XML qui contient d'autres noeuds mais qui ne doivent être traité qu'après

Cette question est apparue à l'origine dans les commentaires du post : Parcours de noeuds XML

Je suis confronté à un nouveau soucis car mon noeud <Contenu> contient d'autres noeuds mais qui ne doivent être traité qu'après : 

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <tablename>
        <Table>Erp.BRIEFS</Table>
        <Action>HAjoute</Action>
        <CleIris>IDBRIEFS</CleIris>
        <nIdentifiant>2</nIdentifiant>
        <IdIris>137</IdIris>
        <Contenu>![CDATA[
            <IDBRIEFS>2</IDBRIEFS>
            <Numero>8</Numero>
            ]]
        </Contenu>
    </tablename>
    <tablename>
        <Table>Erp.COMMANDES</Table>
        <Action>HAjoute</Action>
        <CleIris>IDCOMMANDES</CleIris>
        <nIdentifiant>5</nIdentifiant>
        <IdIris>138</IdIris>
        <Contenu>![CDATA[
            <IDCOMMANDES>5</IDCOMMANDES>
            <CLISId>4399</CLISId>
            ]]
        </Contenu>
    </tablename>
</data>

C'est à dire qu'avec l'exemple ci-dessus je récupère le nom de la classe et du coup le Correlate de data ne fonctionne plus. 

Mais je souhaitais faire un premier Correlate pour le nom de la classe et ensuite un second correlate avec les rubriques de la classe récupérer auparavant. C'est à dire que <IDBRIEFS> et <Numero> sont des rubriques de la classe Erp.BRIEFS et de même pour Erp.COMMANDES. 

Malgré les CDATA cela ne fonctionne pas. 

Discussion (2)1
Connectez-vous ou inscrivez-vous pour continuer

Re,

Attention l'utilisation de CDATA doit être : 

        	<![CDATA[<IDBRIEFS>2</IDBRIEFS>
        	<Numero>8</Numero>]]>

Dans ce cas, il faut modifier le type de la property "Contenu" en %Stream.GlobalCharacter:

Class demo.correlate.structure.TableName Extends (%RegisteredObject, %XML.Adaptor)
{

Property Table As %String;
Property Action As %String;
Property CleIris As %String;
Property nIdentifiant As %String;
Property IdIris As %String;
Property Contenu As %Stream.GlobalCharacter;
}

Class demo.correlate.Test
{

/// Do ##class(demo.correlate.Test).Test()
ClassMethod Test()
{
	#dim data As demo.correlate.structure.Data
	#dim tableName As demo.correlate.structure.TableName
	
	Set xmlTest = ##class(%Dictionary.CompiledXData).%OpenId($classname()_"||XMLTest",,.sc).Data
	
	If $$$ISERR(sc) Do $SYSTEM.Status.DisplayError(sc) Quit sc
	
	Set reader=##class(%XML.Reader).%New()
	Do reader.Correlate("data","demo.correlate.structure.Data")
	Set sc = reader.OpenStream(.xmlTest)
	Do reader.Next(.data)
		
	Set key = ""
	Set tableName = data.tablename.GetNext(.key)
	While key '= "" {
		Write !,"+ table: ", tableName.Table
		Write !,"+ Contenu: ", tableName.Contenu.Read()
		Set tableName = data.tablename.GetNext(.key)
	}
	
	Quit $$$OK
}

XData XMLTest
{
<?xml version="1.0" encoding="UTF-8"?>
<data>
    <tablename>
        <Table>Erp.BRIEFS</Table>
        <Action>HAjoute</Action>
        <CleIris>IDBRIEFS</CleIris>
        <nIdentifiant>2</nIdentifiant>
        <IdIris>137</IdIris>
        <Contenu>
        	<![CDATA[<IDBRIEFS>2</IDBRIEFS>
        	<Numero>8</Numero>]]>
        </Contenu>
    </tablename>
    <tablename>
        <Table>Erp.COMMANDES</Table>
        <Action>HAjoute</Action>
        <CleIris>IDCOMMANDES</CleIris>
        <nIdentifiant>5</nIdentifiant>
        <IdIris>138</IdIris>
        <Contenu>
       		<![CDATA[<IDCOMMANDES>5</IDCOMMANDES>
            <CLISId>4399</CLISId>]]>
        </Contenu>
    </tablename>
</data>
}

}

A l'exécution de la méthode test, vous aurez

USER>Do ##class(demo.correlate.Test).Test()
 
+ table: Erp.BRIEFS
+ Contenu:
                        <IDBRIEFS>2</IDBRIEFS>
                                                        <Numero>8</Numero>
                                                                                 
+ table: Erp.COMMANDES
+ Contenu:
                                <IDCOMMANDES>5</IDCOMMANDES>
                                                                        <CLISId>4399</CLISId>

Vous pouvez donc récupérer toutes les occurrences de "Contenu" dans des streams séparés et faire d'autres correlate :)