|
|
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. В мою программу приходит строка в виде xml-документа. Мне нужно её парсить (превращать в нужные объекты). Использую базовый JAXB. Расставил все комментарии, написал нужный код, но почему-то он не парсит нужный объект. Пример XML: Здравствуйте. В мою программу приходит строка в виде xml-документа. Мне нужно её парсить (превращать в нужные объекты). Использую базовый JAXB. Расставил все комментарии, написал нужный код, но почему-то он не парсит нужный объект. Пример XML: <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <documentrequest type="staff" mode_display="employ_and_dismiss" subdiv=""> <staff> <staffnode last_name="Бердников" first_name="Дмитрий" middle_name="" id_internal="1333771" id_external="" tabel_id="0000000000" date_begin="01.01.1980" date_action="01.01.1980" id_subdiv_external="" id_appoint_external="{53B582F1-ECEB-4581-BC06-19C24228B11F}" id_graphwork_external="{3A1E523D-3936-4E20-A08A-D07ABAE5BC20}" id_subdiv_internal="1333419" id_appoint_internal="1333397" id_graphwork_internal="1333495" date_dismiss="" path_photo=""> <identifiers/> </staffnode> <staffnode last_name="Богаткина" first_name="Светлана" middle_name="Владимировна" id_internal="1333772" id_external="" tabel_id="0000000000" date_begin="01.01.1980" date_action="01.01.1980" id_subdiv_external="" id_appoint_external="{53B582F1-ECEB-4581-BC06-19C24228B11F}" id_graphwork_external="{3A1E523D-3936-4E20-A08A-D07ABAE5BC20}" id_subdiv_internal="1333411" id_appoint_internal="1333397" id_graphwork_internal="1333495" date_dismiss="" path_photo=""> <identifiers> <identifier type_identifier="family_number" id_card="7466" identifier="9236095" identifier_transformed="9236095" date_begin_action="23.08.2016" date_end_action="01.01.3015" prohibit="false"/> </identifiers> </staffnode> <staffnode last_name="Борзунова" first_name="Лилия" middle_name="Владимировна" id_internal="1333773" id_external="" tabel_id="0000000000" date_begin="01.01.1980" date_action="01.01.1980" id_subdiv_external="" id_appoint_external="{14FBA985-0576-485A-8ED8-D6E81DC92BFC}" id_graphwork_external="{3A1E523D-3936-4E20-A08A-D07ABAE5BC20}" id_subdiv_internal="1333429" id_appoint_internal="1333389" id_graphwork_internal="1333495" date_dismiss="" path_photo=""> <identifiers/> </staffnode> <staffnode last_name="Бут" first_name="Наталья" middle_name="Николаевна" id_internal="1333775" id_external="" tabel_id="0000000000" date_begin="01.01.1980" date_action="01.01.1980" id_subdiv_external="" id_appoint_external="{53B582F1-ECEB-4581-BC06-19C24228B11F}" id_graphwork_external="{3A1E523D-3936-4E20-A08A-D07ABAE5BC20}" id_subdiv_internal="1333409" id_appoint_internal="1333397" id_graphwork_internal="1333495" date_dismiss="" path_photo=""> <identifiers/> </staffnode> </staff> </documentrequest> Мой код, который занимается парсингом: //parse the response with the list of employees public static List<Employee> parseXmlStaff(String xml) throws JAXBException { DocumentRequest documentRequest = (DocumentRequest) parse(xml, Employee.class, AccessCard.class,DocumentRequest.class); return documentRequest.getStaff(); } private static Object parse(String xml, Class...classToBeBound) throws JAXBException { Reader reader = new StringReader(xml); JAXBContext context = JAXBContext.newInstance(classToBeBound); Unmarshaller unmarshaller = context.createUnmarshaller(); return unmarshaller.unmarshal(reader); } Классы объектов, которые парсятся: @XmlRootElement(name = "documentrequest") public class DocumentRequest { private List<Employee> staff; //------------- Getters and Setters ---------------------------- @XmlElement(name = "staffnode") @XmlElementWrapper(name = "staff") public List<Employee> getStaff() { return staff; } public void setStaff(List<Employee> staff) { this.staff = staff; } } @XmlRootElement(name = "staffnode") public class Employee { private String firstName; private String middleName; private String lastName; private String pathToPhoto; private int idInternal; private String idExternal; private int tabelId; private Date dateBegin; private Date dateAction; private String idSubdivExternal; private String idGraphworkExternal; private String idAppointExternal; private int idSubdivInternal; private int idGraphworkInternal; private int idAppointInternal; private Date dateDismiss; private List<AccessCard> accessCards; public Employee() { } public Employee(String firstName, String middleName, String lastName, String pathToPhoto, int idInternal, String idExternal, int tabelId, Date dateBegin, Date dateAction, String idSubdivExternal, String idGraphworkExternal, String idAppointExternal, int idSubdivInternal, int idGraphworkInternal, int idAppointInternal, Date dateDismiss) { this.firstName = firstName; this.middleName = middleName; this.lastName = lastName; this.pathToPhoto = pathToPhoto; this.idInternal = idInternal; this.idExternal = idExternal; this.tabelId = tabelId; this.dateBegin = dateBegin; this.dateAction = dateAction; this.idSubdivExternal = idSubdivExternal; this.idGraphworkExternal = idGraphworkExternal; this.idAppointExternal = idAppointExternal; this.idSubdivInternal = idSubdivInternal; this.idGraphworkInternal = idGraphworkInternal; this.idAppointInternal = idAppointInternal; this.dateDismiss = dateDismiss; } @XmlAttribute(name = "first_name") public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } @XmlAttribute(name = "middle_name") public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } //some code: getters and setters @XmlAttribute(name = "id_appoint_internal") public int getIdAppointInternal() { return idAppointInternal; } public void setIdAppointInternal(int idAppointInternal) { this.idAppointInternal = idAppointInternal; } @XmlAttribute(name = "date_dismiss") @XmlJavaTypeAdapter(DateAdapter.class) public Date getDateDismiss() { return dateDismiss; } public void setDateDismiss(Date dateDismiss) { this.dateDismiss = dateDismiss; } @XmlElementWrapper(name = "identifiers") @XmlElement("identifier") public List<AccessCard> getAccessCard() { return accessCards; } public void setAccessCard(List<AccessCard> accessCards) { this.accessCards = accessCards; } } @XmlRootElement(name = "identifier") public class AccessCard { private String TypeIdentifier; private int idCard; private int identifier; private int identifierTransformed; private Date dateBegin; private Date dateEnd; private boolean prohibit; @XmlAttribute(name = "type_identifier") public String getTypeIdentifier() { return TypeIdentifier; } public void setTypeIdentifier(String typeIdentifier) { TypeIdentifier = typeIdentifier; } @XmlAttribute(name = "id_card") public int getIdCard() { return idCard; } public void setIdCard(int idCard) { this.idCard = idCard; } @XmlAttribute(name = "identifier") public int getIdentifier() { return identifier; } public void setIdentifier(int identifier) { this.identifier = identifier; } //some code } Проблема, что он не получает карточки доступа (тег identifier), всё остальное - получает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2017, 13:18 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Нашёл ошибку с импортом (импортировал не ту аннотацию XmlElement). Исправил. Но теперь вылетает NPE. Как раз при анмаршаллинге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 09:59 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
MaxLich, Для начала попробуйте везде заполнить identifiers и identifier. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 10:36 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery Shiskin, В смысле "заполнить"? В xml? Так он мне приходит именно в таком виде. Я не выбираю. У кого-то есть карта доступа, у кого-то - нет. Нужно как-то работать с этим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 10:43 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
MaxLich, Но, как я понял, клиентский код ваш. Я когда-то с jaxb работал, забыл, но помнится, что были для аннотаций параметры nillable. Надо Вам разобраться со случаем когда коллекция тэгов пуста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 10:54 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery Shiskin, Попробовал в тестовом режиме дать ему xml, где у сотрудников заполнены все карты доступа. И всё равно NPE. Видимо, что-то в аннотациях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 10:55 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Сама получаемая ошибка: consoleException in thread "AWT-EventQueue-0" java.lang.NullPointerException at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:289) at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:253) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Scope.add(Scope.java:106) at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty$ReceiverImpl.receive(ArrayERProperty.java:198) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:597) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:165) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609) at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:351) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:214) at org.limantrade.model.xml.XmlParser.parse(XmlParser.java:59) at org.limantrade.model.xml.XmlParser.parseXmlStaff(XmlParser.java:18) at org.limantrade.model.PercoConnectorMock.getStaffList(PercoConnectorMock.java:42) at org.limantrade.model.MainModel.loadTableModelEmployees(MainModel.java:68) at org.limantrade.model.MainModel.loadTableModel(MainModel.java:51) at org.limantrade.controller.MainController.onRefreshTable(MainController.java:29) at org.limantrade.view.ViewGUI.fireUpdateTable(ViewGUI.java:163) at org.limantrade.view.guicomponents.PanelTableWithButton.lambda$addComponents$0(PanelTableWithButton.java:57) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6533) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6298) at java.awt.Container.processEvent(Container.java:2237) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2295) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4526) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467) at java.awt.Container.dispatchEventImpl(Container.java:2281) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 10:57 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
MaxLich, Попробуйте @XmlElementWrapper(name = "identifiers" nillable=true) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:04 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery Shiskin, Настораживает, что не все атрибуты для identifire представлены в классе. Попробуйте в самом первом staffnode убрать тэги и также как и для других укказать <identifires/>. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:11 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery Shiskin, Увы, не помогло (хотя я тоже подумал, что может быть из-за этого). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:15 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery ShiskinValery Shiskin, Настораживает, что не все атрибуты для identifire представлены в классе. Попробуйте в самом первом staffnode убрать тэги и также как и для других укказать <identifires/>. Почему не все? Вроде все, да и я думаю, это не важно. Просто он будет их пропускать, и ничего не делать. Будет заполнять только те поля, для которых есть соот-щие атрибуты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:17 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery ShiskinValery Shiskin, Попробуйте в самом первом staffnode убрать тэги и также как и для других укказать <identifires/>. Что-то не понял, что Вы предлагаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:20 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:24 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
MaxLich, Первое, это исправить @XmlElement("identifier") на @XmlElement(name="identifier") Если опять не пройдет (в чем я сомневаюсь), то во втором тэге <staffnode> замените Ваш <identifiers ... > на пустой тэг <identifires/> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:28 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery ShiskinMaxLich, Первое, это исправить @XmlElement("identifier") на @XmlElement(name="identifier") Если опять не пройдет (в чем я сомневаюсь), то во втором тэге <staffnode> замените Ваш <identifiers ... > на пустой тэг <identifires/> 1-ое, как я писал выше, я уже сделал, и не помогло. По второму сейчас попробую что-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:38 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, хм, это помогло. Но хотелось бы решить эту задачу средствами JAXB. Надо почитать про пустные коллекции в xml. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:42 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
MaxLich, Я взял Ваш код и запустил. Все работает, после исправления @XmlElement("identifier") на @XmlElement(name="identifier") Вы нигде не говорили, что исправили эту ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:47 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery Shiskin, Правда мне пришлось сделать свой date Adapter, но это не должно повлиять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:53 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
MaxLichхм, это помогло. Но хотелось бы решить эту задачу средствами JAXB. Надо почитать про пустные коллекции в xml. JAXB сам такой код генерит по схеме. Он, ведь, даже не знает какой вам тип коллекции нужен. Так что не морочте голову. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:55 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Valery Shiskin, Все-таки, еще раз проверьте import операторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 12:13 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Попробовал закомментить код в геттер: Код: java 1. 2. 3. 4. 5. 6. 7. 8. И скормил ему такой xml: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Всё прошло, объекты AccessCard получились пустыми (как и ожидалось). Но если после этого ему скармливать другой xml: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. То опять такая же ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 13:04 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
И как я и ожидал, если файл смешанный (с заполненными тегами и с пустыми), то тоже ошибка вылетает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 13:06 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
Попробовал сгенерировать код с помощью ИДЕИ: код, конечно, ужасный, и с ним тяжело работать, но заметил, что он тоже в геттере сформировал проверку на нулл: Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 13:17 |
|
||
|
Не получается распарсить xml
|
|||
|---|---|---|---|
|
#18+
MaxLich, Я полностью, без изменений, кроме DateAdapter и исправленной ошибки, взял ваш код, ваш xml (copy/paste) запустил у себя и напечатал. Без проблем. Чудес не бывает. Посмотрите, как у вас сформирована строка знаков с xml кодом, еще раз посмотрите import. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 13:18 |
|
||
|
|

start [/forum/search_topic.php?author=satan_angel&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 666ms |
| total: | 849ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...