Лучший способ разобрать строку XML в Java? - PullRequest
4 голосов
/ 06 октября 2009

Я анализирую строку в Java, используя javax.xml.parsers.DocumentBuilder. Однако не существует функции для непосредственного анализа строки, поэтому вместо этого я делаю это:

public static Document parseText(String zText) {
    try
    {
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(new InputSource(new StringReader(zText)));
        doc.getDocumentElement().normalize();
        return doc;
    }
    catch (Exception e) {
            e.printStackTrace();
    }
    return null;
}

Это лучший способ сделать это? Я чувствую, что должен быть более простой способ ... спасибо!

Ответы [ 5 ]

5 голосов
/ 06 октября 2009

Чтобы ответить на ваш вопрос напрямую - насколько мне известно, лучшего пути нет. Мой источник ввода используется потому, что он более универсален и может обрабатывать ввод из файла, строки или по проводам, насколько я понимаю.

Вы также можете попробовать использовать синтаксический анализатор SAX Xml - он немного более простой и использует шаблон посетителя, но он выполняет свою работу, а для небольших наборов данных и простых схем XML он довольно прост в использовании. SAX также включен в основной JRE.

2 голосов
/ 06 октября 2009

лично я предпочитаю dom4j . Проверьте их быстрый старт, это довольно просто.

1 голос
/ 06 октября 2009

Я согласен с aperkins , и вот мой помощник по javax:

/**
 * Returns a {@code Document} from the specified XML {@code String}.
 * 
 * @param xmlDocumentString a well-formed XML {@code String}
 * @return a {@code org.w3c.dom.Document}
 */
public static Document getDomDocument(String xmlDocumentString)
{
    if(StringUtility.isNullOrEmpty(xmlDocumentString)) return null;

    InputStream s = null;

    try
    {
        s = new ByteArrayInputStream(xmlDocumentString.getBytes("UTF-8"));
    }
    catch(UnsupportedEncodingException e)
    {
        throw new RuntimeException("UnsupportedEncodingException: " + e.getMessage());
    }

    return XmlDomUtility.getDomDocument(s);
}

Этот помощник зависит от другого:

/**
 * Returns a {@code Document} from the specified {@code InputStream}.
 * 
 * @param input the {@code java.io.InputStream}
 * @return a {@code org.w3c.dom.Document}
 */
public static Document getDomDocument(InputStream input)
{
    Document document = null;
    try
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        document = builder.parse(input);
    }
    catch(ParserConfigurationException e)
    {
        throw new RuntimeException("ParserConfigurationException: " + e.getMessage());
    }
    catch(SAXException e)
    {
        throw new RuntimeException("SAXException: " + e.getMessage());
    }
    catch(IOException e)
    {
        throw new RuntimeException("IOException: " + e.getMessage());
    }

    return document;
}

Обновление: это мой импорт:

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
1 голос
/ 06 октября 2009

Я бы не нормализовался, если бы я спешил или мне было все равно. Вы можете нормализовать только узлы, когда вам нужно.

0 голосов
/ 22 июля 2011

Еще один вариант, который вы можете попробовать - это Castor, я думаю, что он делает вещи намного проще:

http://www.castor.org/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...