Простой способ сделать XML в Java
Есть ли простой способ читать и писать Xml на Java?
Я использовал SAX-парсер раньше, но я помню, что он не интуитивно понятен, я посмотрел пару уроков для JAXB, и это выглядит просто сложно.
Я не знаю, был ли я испорчен классом Cml XmlDocument, но все, что я хочу сделать, это создать документ Xml, представляющий набор классов и их членов (некоторые являются атрибутами, некоторые являются элементами).
Я бы посмотрел на сериализацию, но XML должен иметь тот же формат, что и выходные данные приложения aC#, которое я реверс-инжиниринг в Java.
11 ответов
Dom4j - это простой API для создания XML-документов в Java.
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Toby" )
.addAttribute( "location", "Germany" )
.addText( "Tobias Rademacher" );
Некоторые из наиболее популярных подходов для рассмотрения:
Java-архитектура для связывания XML
JAXB - это спецификация для стандартной привязки XML. Если у вас уже есть XSD, он может генерировать ваши классы Java для вас, и тогда все, что осталось, это использовать стандартный API для маршалинга / демаршаллинга.
Другие обязательные подходы
Как и в случае с JAXB, в этих подходах используются конфигурации связывания на основе XML. Они могут обеспечить более точный контроль процесса демаршаллинга.
Ролл свой
Если вы используете jdk 1.4 или новее, взгляните на класс XMLEncoder.
Существует широкий выбор вариантов обработки XML для Java, хотя, судя по документации.NET для XmlDocument, реализация Java DOM является наиболее близким из готовых эквивалентов.
.NET XmlDocument:
Этот класс реализует ядро уровня 1 модели объектов документа (DOM) W3C и ядро уровня 2 DOM.
Документ Java:
См. Также Базовую спецификацию объектной модели документа (DOM) уровня 3.
Образец кода:
public static void main(String[] args) throws Exception {
File xmlFile = new File(".classpath");
// read it
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(xmlFile);
// walk it
System.out.println("Node count=" + countNodes(document));
// write it
Source source = new DOMSource(document);
Result result = new StreamResult(System.out);
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(source, result);
}
/** Doesn't count attributes, etc */
private static int countNodes(Node node) {
int count = 0;
NodeList kids = node.getChildNodes();
count += kids.getLength();
for (int i = 0; i < kids.getLength(); i++) {
count += countNodes(kids.item(i));
}
return count;
}
На данный момент самый простой способ - это MarkupBuilder в Groovy. Думайте о Groovy как о новом синтаксисе для Java. XmlSlurper может использоваться для чтения XML.
Я думаю, что Apache XMLBeans обеспечивает функциональность, к которой вы стремитесь.
Страница Википедии дает хороший обзор и пример использования.
Я думаю, что JAXB сложен, только если вы посмотрите на неправильные примеры. В частности, да, основанный на схеме способ может запутаться. Но сначала код, основанный на аннотациях, тривиально прост.
Другая простая альтернатива - XStream. И для не связывающего случая, StaxMate, который является надстройкой для потоковых парсеров Stax.
Я бы, конечно, использовал XOM, если вы хотите DOM-подобный подход, и SAX (www.sax.org), если вы хотите SAX-подобный подход. Я принимал участие в ранней разработке XML, а SAX был разработан как подход, основанный на событиях, что полезно для некоторых приложений. DOM/XOM и SAX дополняют друг друга - иногда вам нужно одно, иногда другое. Если вы хотите строить объекты по ходу, а не читать все в память, используйте SAX. Если вы готовы прочитать все, а затем обработать, используйте XOM.
Я потратил слишком много времени, пытаясь заставить работать DOM W3C - IMO, он плохо определен со слишком многими способами выполнения одних вещей и недостаточно для других. Когда пришел XOM, это произвело революцию в моей производительности.
Сообщество XOM очень хорошо осведомлено, сфокусировано и полезно.