/ / Create Node à partir d'une chaîne XML sans utiliser Parse - xml, groovy

Créer un nœud à partir d'une chaîne XML sans utiliser Parse - xml, groovy

J'ai une fonction qui prend dans un ODataObject qui contient du code XML d’un événement déclenché par un bus de messages. Je suis en train d’écrire des cas de test pour vérifier la manière dont ma fonction traite le XML provenant du bus de messages, qui consiste uniquement en ceci: <?xml version="1.0" encoding="utf-8"?>.

C’est ainsi que je crée le DataObject qui est transmis à mes autres cas de test

final Document document = DOMUtil.parse(TestEventXML)
final DataObject dataObject = new ODataObject(document.getDocumentElement())
myListener.onMessage(dataObject)

Cependant, en passant la chaîne ci-dessus comme TestEventXML renvoie cette erreur:

java.lang.NullPointerException: Cannot invoke method getDocumentElement() on null object

car appeler DOMUtil.parse() sur une chaîne XML mal formatée retournera null.

Donc, j'ai besoin d'une sorte de travail autour qui me permettrait de créer un org.w3c.dom.Node que je peux passer dans le constructeur ODataObject sur une chaîne XML que j'ai créée. Toutes les idées, suggestions, etc. seraient grandement appréciées.

MODIFIER - Résumé de la question

Pour clarifier, je sais que la chaîne que je "essaie depasser en est juste l'en-tête d'un fichier XML sans contenu. Mais parfois, c’est ce qui passe par le bus de messages. Je dois donc vérifier que ma fonction le gère correctement. Ma fonction contient du code permettant de traiter le XML malformé. Par conséquent, ma question n’est pas de savoir si XML est mal formé. Le problème est que je dois créer un objet de données pour vérifier que je le gère correctement, mais je ne peux pas créer un objet de données à l’aide de XML mal formé, car parse renvoie null.

EDIT 2 - Comment je gère actuellement le XML malformé / nul

Dans mon onMessage fonction, j'appelle le toString méthode sur l'objet DataObject entrant, qui renvoie une chaîne du code XML dans l'objet DataObject. Ensuite, pour créer un groovy.util.Node objet, j'essaie new XmlParser().parseText(xmlString) et attraper tous SAXParseExcetions, résultant du XML malformé ou nul. le onMessage La fonction retourne alors simplement, en sautant tout le code d'analyse dans le reste de la fonction.

Addenda - Une autre question qui pourrait répondre à ma question initiale
org.w3c.dom.Node est une interface, donc je ne peux pas "juste faire new 0DataObject(new Node()). Existe-t-il un moyen de créer un nœud et de définir l'attribut correct comme étant ma chaîne XML?

S'il vous plaît commenter avec toutes les questions que vous avez.

Réponses:

2 pour la réponse № 1

Correctif qui a fonctionné: utilisé Groovy "s MockFor classe pour créer une maquette d'un ODataObject. Lors de la création du DataObject, je passe du XML correctement formaté. Cependant, lorsque le ODataObject"s toString fonction est appelée, je l’intercepte et renvoie le XML mal formé.

Je vais essayer d’examiner la suggestion de Platinum Azure pour voir comment ODataObject est construit par le bus de messages que je suis en train d’écouter pour déterminer pourquoi il renvoie le message. <?xml [...]> chaîne.


1 pour la réponse № 2

Je peux me tromper, mais je sens que vous essayezpour résoudre le mauvais problème. J'imagine que je ne suis pas sûr de savoir pourquoi vous ne pouvez pas simplement construire le nœud manuellement, ou même pourquoi vous devez le construire du tout quand vous savez que le XML n'est pas bon.

Si vous attendez plus d'informations de la part duSi vous avez le contrôle du schéma pour les données entrantes, vous devriez peut-être d'abord envoyer une longueur de contenu, puis attendre autant de données avant d'essayer de faire le travail d'analyse syntaxique XML. Puisque XML est une grammaire sans contexte qui repose fortement sur des nœuds équilibrés, il n’est vraiment pas judicieux d’essayer de construire un document XML en mémoire sans avoir le dernier octet, y compris la fermeture de la balise racine.

Sinon, si vous avez juste à traiter avec le null, envisagez d’utiliser le modèle d'objet nul.