Преобразование xml с пространствами имен в json в java

Я пытаюсь преобразовать xml в json с помощью java, а затем преобразовать json обратно в xml после изменения, который должен дать тот же xml. Атрибуты xml имеют пространства имен.

Мой образец xml:

<?xml version = "1.0" encoding = "UTF-8"?>
<ns2:testplan xmlns:ns2 = "http://jazz.net/xmlns/alm/qm/v0.1/" xmlns:ns1 = "http://schema.ibm.com/vega/2008/" xmlns:ns3 = "http://purl.org/dc/elements/1.1/" xmlns:ns4 = "http://jazz.net/xmlns/prod/jazz/process/0.6/" xmlns:ns5 = "http://jazz.net/xmlns/alm/v0.1/" xmlns:ns6 = "http://purl.org/dc/terms/" xmlns:ns7 = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns8 = "http://jazz.net/xmlns/alm/qm/v0.1/testscript/v0.1/" xmlns:ns9 = "http://jazz.net/xmlns/alm/qm/v0.1/executionworkitem/v0.1" xmlns:ns10 = "http://open-services.net/ns/core#" xmlns:ns11 = "http://open-services.net/ns/qm#" xmlns:ns12 = "http://jazz.net/xmlns/prod/jazz/rqm/process/1.0/" xmlns:ns13 = "http://www.w3.org/2002/07/owl#" xmlns:ns14 = "http://jazz.net/xmlns/alm/qm/qmadapter/v0.1" xmlns:ns15 = "http://jazz.net/xmlns/alm/qm/qmadapter/task/v0.1" xmlns:ns16 = "http://jazz.net/xmlns/alm/qm/v0.1/executionresult/v0.1" xmlns:ns17 = "http://jazz.net/xmlns/alm/qm/v0.1/catalog/v0.1" xmlns:ns18 = "http://jazz.net/xmlns/alm/qm/v0.1/tsl/v0.1/" xmlns:ns20 = "http://jazz.net/xmlns/alm/qm/styleinfo/v0.1/" xmlns:ns21 = "http://www.w3.org/1999/XSL/Transform">
<ns2:projectArea href = "https://testserver:9080/qm/resource/itemOid/com.ibm.team.process.ProjectArea/_xv6jsJceEeimbPqnRT_G_Q" alias = "projectArea"/>
<ns3:identifier>https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/testplan/urn:com.ibm.rqm:testplan:70?revision=294</ns3:identifier>
<ns2:stylesheet href = "https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/testplan/urn:com.ibm.rqm:testplan:70?stylesheet=true"/>
<ns2:snapshot>
<ns3:title>testplan_70_&lt;Reason&gt;_&lt;Version&gt;_on_16 Apr 2019 05:50</ns3:title>
<ns5:updated>2019-04-16T12:20:01.644Z</ns5:updated>
<ns2:revision>294</ns2:revision>
</ns2:snapshot>
<ns2:webId>70</ns2:webId>
<ns3:title>Demo test plan 06</ns3:title>
<ns3:description/>
<ns2:creationDate>2019-01-22T10:36:40.289Z</ns2:creationDate>
<ns5:updated>2019-04-16T12:20:01.644Z</ns5:updated>
<ns5:state ns7:resource = "https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/process-info/_xv6jsJceEeRT_G_Q/workflowstate/com.ibm.rqm.process.testplan.workflow/com.ibm.rqm.planning.common.underreview">com.ibm.rqm.planning.common.underreview</ns5:state>
<ns3:creator ns7:resource = "https://testserver:9080/jts/resource/itemName/com.ibm.team.repository.Contributor/JLO1COB">abc</ns3:creator>
<ns5:owner>unassigned</ns5:owner>
<ns2:priority ns7:resource = "https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/process-info/_xv6jsJceEeimbPqnG_Q/priority/literal.priority.101">literal.priority.101</ns2:priority>
<ns2:locked>false</ns2:locked>
<ns2:component href = "https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/component/_yzQ3EZcmbPqnRT_G_Q"/>
</ns2:testplan>

Может кто-нибудь, пожалуйста, помогите мне преобразовать драгоценно, используя java.

Я пытался преобразовать с помощью org.json.XML, но он не давал правильного json с ключами/значениями jsonobject, имеющими пространства имен.

Код, который я пробовал, не дает ответа:

JSONObject jsonObject = XML.toJSONObject("xml");

Я ожидаю способ преобразования, который дает Json с правильным форматом и объекты json, имеющие пространства имен, и если я скрою этот json, он должен дать исходный xml Пожалуйста помогите.

Я имею в виду, что в JSON нет такой вещи, как пространства имен, так что...

kumesana 10.07.2019 11:39

В json нет такого понятия, как пространство имен. Но если мы преобразуем xml в json... объект json может иметь пространство имен.

Ajith 10.07.2019 12:34

Я понятия не имею, что вы имеете в виду. Вы должны привести примеры. Но когда что-то не имеет пространств имен с самого начала, нет никаких волшебных обстоятельств, которые каким-то образом сделают так, что теперь у него есть пространства имен. JSON не имеет пространств имен. Так что ничто не сделает так, чтобы у него были пространства имен.

kumesana 10.07.2019 15:11

Да, я знаю, у json не будет пространств имен. Но jsonObject или ключи могут быть правильными пространствами имен. Я дал xml выше, и у xml есть пространство имен. Мне нужно преобразовать этот xml в json и изменить определенные значения из json и преобразовать его обратно. Поэтому, когда я конвертирую его обратно в xml, мне нужно правильно вернуть пространства имен, чтобы он был действительным json

Ajith 10.07.2019 15:14

Пространства имен по сути являются частью имен элементов: они всегда одинаковы. Не помещайте пространства имен в JSON и просто используйте имена, которые достаточно уникальны, чтобы их не нужно было разделять в пространствах имен. Затем при преобразовании обратно в XML верните пространства имен. Ни одна библиотека не сделает за вас такое преобразование, сначала преобразуйте из XML в объект, затем из объекта в JSON и наоборот.

kumesana 10.07.2019 18:27

Преобразование связано с тем, что мне нужен xml с несколькими изменениями для использования в качестве тела запроса для почтового запроса.

Ajith 11.07.2019 09:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
2 385
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете попробовать XmlMapper от Джексона (com.fasterxml.jackson.dataformat.xml.XmlMapper)

XmlMapper xmlMapper = new XmlMapper();
JsonNode jsonNode = xmlMapper.readTree(string.getBytes());
ObjectMapper objectMapper = new ObjectMapper();
String value = objectMapper.writeValueAsString(jsonNode);

редактировать: зависимости, которые я использовал

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.0</version>
</dependency>
<dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.9.0</version>
</dependency>

Привет, спасибо за быстрый ответ. Не могли бы вы сказать мне, какие все зависимости нужны?

Ajith 10.07.2019 12:10

Должна быть версия «Jackson Dataformat XML» версии 2.9.0 (или выше?): добавлена ​​​​зависимость к ответу.

tobsob 10.07.2019 14:07

Я добавил предложенную вами зависимость. Но я получаю ошибку сейчас. Вызвано: java.lang.ClassNotFoundException: org.codehaus.stax2.io.Stax2ByteArraySource в этой строке JsonNode jsonNode = xmlMapper.readTree(string.getBytes());

Ajith 10.07.2019 14:19

Откуда импортируется ваш XmlMapper? Добавлена ​​еще одна зависимость.

tobsob 10.07.2019 14:44

@Ajith, вам нужен файл jar "stax2-api". Если у вас есть проект Maven, он загружает дополнительные файлы jar. Мой проект не был Maven, и я импортировал только эти 2 файла jar (jackson-databind и jackson-dataformat-xml), как было предложено, и получил ту же ошибку. После создания проекта Maven и попытки добавления зависимостей я увидел другие файлы jar. stax2-api-3.1.4.jar — один из них, возможно, вам понадобятся и другие jar-файлы.

count_campeador 21.04.2020 16:38

Получите JSONObject и преобразуйте его в строку JSON:

JSONObject jsonObject = XML.toJSONObject("xml");
String jsonString = jsonObject.toString();

Если вы хотите красиво напечатать строку, используйте toString(int), которая принимает количество пробелов в качестве аргумента.

String prettyPrintedJson = jsonObject.toString(4);

Не решает тему вопроса...

Sir Montes 24.01.2022 15:38

Этот вопрос немного устарел, но я хотел бы поделиться своим ответом о той же задаче, которую я сделал недавно! Требование: Имея этот xml:

<ns2:testplan>
 <ns2:snapshot>
    <ns2:revision>294</ns2:revision>
 </ns2:snapshot>
 <ns2:webId>70</ns2:webId>
 <ns2:title>Demo test plan 06</ns2:title>
</ns2:testplan>

Мы хотели бы преобразовать его в:

{
  "ns2:testplan": {
    "ns2:snapshot": {
      "ns2:revision": 294
    },
    "ns2:title": "Demo test plan 06",
    "ns2:webId": 70
  }
}

Обратите внимание, что с принятым ответом корневой тег <ns2:testplan> и префикс пространства имен не включаются в JSON. Чтобы настроить XmlMapper для сохранения пространства имен и добавления корневого тега, выполните следующие действия:

var module = new SimpleModule().addDeserializer(JsonNode.class, new JsonNodeDeserializer() {
        @Override
        public JsonNode deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            return ctxt.getNodeFactory()
                    .objectNode()
                    .set("ns2:testplan", super.deserialize(p, ctxt)); // this config adds the root tag
        }
    });

XMLInputFactory xmlInputFactory = new WstxInputFactory();
xmlInputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false); // this one keeps the namespace prefix
XmlMapper xmlMapper = new XmlMapper(new XmlFactory(xmlInputFactory, new WstxOutputFactory()));
xmlMapper.registerModule(module);

Затем используйте код принятого ответа для преобразования XML в JSON.

Другие вопросы по теме