item.xml
Код: Выделить всё
1234
[u]This is a description[/u]
End Of description
[u]This is a description[/u]
Я пробовал несколько подходов, и моя основная проблема заключается в том, что пространство имен 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();
}
}
}
Код: Выделить всё
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();
}
}
Код: Выделить всё
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
Код: Выделить всё
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