Как проанализировать часть XML-файла как необработанный XML с помощью JAXB без включения пространств имен в теги?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как проанализировать часть XML-файла как необработанный XML с помощью JAXB без включения пространств имен в теги?

Сообщение Anonymous »

Моя проблема в том, что мне нужно проанализировать XML-файл такого типа:
item.xml

Код: Выделить всё


1234


[u]This is a description[/u]

End Of description



[u]This is a description[/u]



Я хочу, чтобы каждая часть документа была сопоставлена ​​с классом Java, за исключением того, что находится в разделе ItemDescription. Все, что находится в ItemDescription, должно храниться как строка, включая тег, это следует рассматривать как необработанный XML.
Я пробовал несколько подходов, и моя основная проблема заключается в том, что пространство имен xml включается в теги «p» и «br», и я этого не хочу.
Единственный способ исправить это — использовать регулярное выражение, но мне нужно решение, в котором они этого не сделали. меня не добавляют.
Здесь — это пример кода, который выполняет работу, сохраняя при этом пространство имен:
Item.java

Код: Выделить всё

package org.example;

import org.apache.commons.collections4.CollectionUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import javax.xml.bind.annotation.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
import java.util.List;

@XmlRootElement(name = "Item", namespace = "http://www.example.com/item")
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {

@XmlElement(name = "ID", namespace = "http://www.example.com/item")
private String id;

@XmlElement(name = "ItemDescription", namespace = "http://www.example.com/item")
private List itemDescriptions;

// Getters and Setters
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public List getItemDescriptions() {
return itemDescriptions;
}

public void setItemDescriptions(List itemDescriptions) {
this.itemDescriptions = itemDescriptions;
}

@XmlAccessorType(XmlAccessType.FIELD)
public static class ItemDescription {

@XmlAttribute(name = "kind")
private String kind;

// Store raw XML content as a String
@XmlAnyElement(lax = true)
private List elements;

// Getters and Setters
public String getKind() {
return kind;
}

public void setKind(String kind) {
this.kind = kind;
}

public List getElements() {
return elements;
}

public void setElements(List  elements) {
this.elements = elements;
}

public String getElementsAsString() {
if (CollectionUtils.isEmpty(elements)) {
return "";
}

StringBuilder sb = new StringBuilder();
for (Object element : elements) {
// Check if the element is an instance of a JAXB element that can be converted to XML
if (element != null) {
sb.append(element.toString());
}
}
return sb.toString();
}

public String getContentAsString() {
if (CollectionUtils.isEmpty(elements)) {
return "";
}
StringBuilder content = new StringBuilder();
for (Element element : elements) {
// Create a new document to hold the element without namespaces
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Node importedNode = doc.importNode(element, true);
doc.appendChild(importedNode);

// Convert the document to a string
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
content.append(writer);
} catch (Exception e) {
e.printStackTrace();
}
}
return content.toString();
}

}
}
ItemParser.java

Код: Выделить всё

package org.example;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.InputStream;

public class ItemParser {

public void doParse(String resourcePath) throws JAXBException {
// Initialize JAXB context
JAXBContext context = JAXBContext.newInstance(Item.class);
Unmarshaller unmarshaller = context.createUnmarshaller();

// Load XML from resources
InputStream xmlStream = getClass().getClassLoader().getResourceAsStream(resourcePath);
if (xmlStream == null) {
throw new IllegalArgumentException("File not found: " + resourcePath);
}

// Parse XML into Item object
Item item = (Item) unmarshaller.unmarshal(xmlStream);
System.out.println("ID: " + item.getId());

// Print descriptions with raw XML content
if (item.getItemDescriptions() != null) {
for (Item.ItemDescription description : item.getItemDescriptions()) {
System.out.println("Raw XML Content: " + description.getContentAsString());
}
}
}

public static void main(String[] args) {
try {
new ItemParser().doParse("item.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
pom.xml

Код: Выделить всё

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0

org.example
ItemParser
1.0-SNAPSHOT


11
11
UTF-8




org.glassfish.jaxb
jaxb-runtime
2.3.2


org.glassfish.jaxb
jaxb-xjc
2.3.2


junit
junit
4.13.1
test




org.apache.commons
commons-collections4
4.4





src/main/java


src/main/resources





Вывод main в ItemParser.java

Код: Выделить всё

ID: 1234
Raw XML Content: 
[u]This is a description[/u]

End Of description
Raw XML Content: 
[u]This is a description[/u]

Как вы можете видеть, пространство имен документа добавляется в теги.
Что я пробовал
  • регулярное выражение, чтобы избавиться от атрибута xmlns -> оно работает, но не чисто
  • Используйте Transformer, но нет свойства, похожего на OutputKeys.OMIT_XML_DECLARATION для пространств имен.
  • Используйте DOM API для удаления атрибута, начинающегося с «xmlns», с помощью Element.removeAttribute. Удаление атрибутов работает хорошо, но они добавляются обратно при сериализации элемента в строку с помощью преобразователя. Я думаю, это связано с тем, что у элемента все еще есть поле namespaceURI, которое не отображается через API.
  • То же самое, что и в предыдущем пункте. но на клонированном элементе (на всякий случай, если клон может пропустить пространство имен, но нет)
  • Я попытался добавить строку в ItemDescription класс сущности и иметь собственный адаптер, но мне это не удалось. Я думаю, если у класса сущности есть поле String, которое отображает необработанный XML как String, это будет лучшим решением
Я уточняю, что хочу удалить только атрибут пространства имен. Если исходный файл имеет какие-то другие атрибуты, я хочу их сохранить.

Подробнее здесь: https://stackoverflow.com/questions/792 ... cluding-na
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»