/ / Utwórz węzeł z łańcucha XML bez użycia Parse - xml, groovy

Utwórz węzeł z łańcucha XML bez użycia Parse - xml, groovy

Mam funkcję, która przyjmuje ODataObject który zawiera trochę XML z zdarzenia wystrzelonego z szyny komunikatów. Piszę przypadki testowe, aby sprawdzić, w jaki sposób moja funkcja obsługuje XML pochodzący z magistrali komunikatów, która składa się z tylko: <?xml version="1.0" encoding="utf-8"?>.

W ten sposób tworzę obiekt DataObject, który zostanie przekazany do innych moich przypadków testowych

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

Jednak przekazanie powyższego ciągu jako TestEventXML zwraca ten błąd:

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

ponieważ dzwonisz DOMUtil.parse() na niepoprawnie sformatowanym łańcuchu XML zwróci wartość null.

Potrzebuję jakiejś pracy, która pozwoliłaby mi stworzyć org.w3c.dom.Node do którego mogę przejść do konstruktora ODataObject z utworzonego przeze mnie łańcucha XML. Wszelkie pomysły, sugestie itp. Byłyby bardzo mile widziane.

EDYTOWAĆ - Podsumowanie pytania

Aby wyjaśnić, wiem, że String próbujęPrzekazanie jest tylko nagłówkiem pliku XML bez zawartości. Ale czasami dzieje się tak przez magistralę komunikatów, więc muszę przetestować, czy moja funkcja obsługuje ją prawidłowo.Ma funkcja ma kod w obsłudze źle sformułowanego XML, więc moim pytaniem nie jest, jak sprawdzić, czy XML jest zniekształcony. Problem polega na tym, że muszę utworzyć obiekt DataObject, aby przetestować, czy poprawnie go obsługuję, ale nie mogę utworzyć obiektu DataObject przy użyciu zniekształconego kodu XML, ponieważ funkcja parsowana zwraca wartość null.

EDYTUJ 2 - Jak obecnie obsługuję Malformed / Null XML

W moim onMessage funkcja, nazywam toString metoda na przychodzącym obiekcie DataObject, który zwraca ciąg znaków XML w obiekcie DataObject. Następnie, aby utworzyć groovy.util.Node obiekt, próbuję new XmlParser().parseText(xmlString) i złap wszystkich SAXParseExcetions, które wynikają z nieprawidłowego kodu XML lub zera. The onMessage funkcja następnie po prostu wraca, pomijając cały kod parsujący w pozostałej części funkcji.

Uzupełnienie - Kolejne pytanie, które może odpowiedzieć na moje oryginalne pytanie
org.w3c.dom.Node jest interfejsem, więc nie mogę tego zrobić new 0DataObject(new Node()). Czy istnieje sposób na utworzenie węzła i ustawienie właściwego atrybutu na mój ciąg XML?

Prosimy o komentarz z pytaniami, które posiadasz.

Odpowiedzi:

2 dla odpowiedzi № 1

Naprawiono, że zadziałało: Używane Groovy "s MockFor klasa, aby stworzyć makietę ODataObject. Podczas tworzenia obiektu DataObject przekazuję poprawnie sformatowany kod XML. Jednakże, gdy ODataObject"s toString funkcja jest wywoływana, przechwytywam ją i zwracam zniekształcony kod XML.

Spróbuję zajrzeć do sugestii Platinum Azure, aby zobaczyć, jak ODataObject jest budowany przez magistralę komunikatów, do której słucham, aby określić, dlaczego zwraca <?xml [...]> strunowy.


1 dla odpowiedzi nr 2

Mogę się mylić, ale czuję, że próbujeszaby rozwiązać niewłaściwy problem. Chyba nie jestem pewien, dlaczego nie możesz po prostu zbudować węzła ręcznie, ani nawet dlaczego musisz zbudować węzeł w ogóle, gdy wiesz, że XML nie jest dobry.

Jeśli czekasz na więcej informacji zmagistrala komunikatów, a jeśli masz kontrolę nad schematem dla danych przychodzących, może powinieneś najpierw wysłać długość zawartości, a następnie poczekać na tak dużo danych przed próbą wykonania analizy XML? Ponieważ XML to gramatyka bezkontekstowa, która jest silnie oparta na zbalansowanych węzłach, naprawdę nie jest dobrym pomysłem próba skonstruowania dokumentu XML w pamięci bez posiadania każdego ostatniego bajtu, łącznie z zamknięciem głównego tagu.

W przeciwnym razie, jeśli po prostu masz do czynienia z wartością zerową, rozważ zastosowanie metody zerowy wzór obiektu.