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.
Comments
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 :)
Bonjour ,
La solution était de modifier en %Stream.GlobalCharacter pour la balise contenu lors du Correlate.