JAVA, разбор XML - PullRequest
       14

JAVA, разбор XML

0 голосов
/ 16 февраля 2012

Мне нужна помощь в чтении XML-документа.

Я получил Class Person и хочу создать список из этого xml

XML-это что-то вроде:

<root>
<field1></field1>
<field2></field1>
<field3></field1>
<Persons>
<id></id>
<List>
<Person>
<Name>...</Name>
<LastName>...</LastName>
</Person>
<Person>
<Name>...</Name>
<LastName>...</LastName>
</Person>
<Person>
<Name>...</Name>
<LastName>...</LastName>
</Person>
</List
</Persons>
<field4></field1>
<field5></field1>
<field6></field1>

</root>

Я использую DOM-парсер (org.w3c.dom)

Может кто-нибудь, пожалуйста, покажи мне, как лучше всего получить информацию о Персонах?

Спасибо

Ответы [ 6 ]

1 голос
/ 16 февраля 2012

Я не хочу просто оставлять это здесь, но я ответил на похожий вопрос здесь .

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

Наконец, я бы порекомендовал библиотеку, которую я написал, под названием SJXP, которая дает вам производительность STAX с простотой XPath ... это идеальное сочетание двух.

Вы пишете правила типа "/ root / Persons / list / Person / Name" и даете ему свой документ, и он будет срабатывать каждый раз при попадании в имя и вызывать предоставленный пользователем обратный вызов для вас, передавая найденное имя .

Вы создаете несколько правил для всех значений, которые вы хотите, и для альта ... вы можете создать правило START_TAG для открытого тега "/ root / Persons / list / Person" и создать новый "Person p = new Person () "в вашем коде, а затем при попадании каждого подэлемента вы просто устанавливаете соответствующее значение для человека, что-то вроде этого (в качестве примера):

IRule linkRule = new DefaultRule(Type.CHARACTER, "/root/Persons/list/Person/Name") {
    @Override
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
        // Get the last person we added on open-tag.
        Person p = personList.get(personList.size() - 1);

        // <Name> tag was parsed, 'text' is our parsed Name. Set it.
        p.setName(text);
    }
}

Приятной особенностью SJXP является то, что накладные расходы памяти ниже, чем у других подходов синтаксического анализатора, и производительность выше (SAX будет анализировать элементы на совпадение, синтаксический анализ на основе STAX не анализирует элементы из потока, пока они не будут требуется).

В конечном итоге вы создадите столь же запутанный код, чтобы пройтись по DOM и всем элементам Node, чтобы создать свой список.

ПОСЛЕДНО, если вы чувствуете себя комфортно с XML-> Object mapping, вы можете делать то, что сказал другой человек, и использовать JAXB. Вам нужно будет написать схему для ваших XML-файлов, а затем она сгенерирует для вас объекты Java, которые будут идеально им соответствовать. Затем вы можете просто сопоставить ваш XML-файл непосредственно с вашим Java-объектом и вызвать что-то вроде "people.getList ()" или что-то, что JAXB сгенерирует для вас.

В этом случае издержки памяти и производительность будут на одном уровне с анализом DOM (примерно).

1 голос
/ 16 февраля 2012

Я предпочитаю JAXB.Он также присутствует в J2SE API.

Пишите, если вам нужна помощь.

1 голос
/ 16 февраля 2012

Вы должны использовать Простой API для XML ( SAX ). Вы также можете использовать потоковый API для XML (StaX) ( учебник ).

1 голос
/ 16 февраля 2012

Если вы хотите только читать информацию, вам лучше (после загрузки DOM) использовать XPath на нем. XPath присутствует в J2SE API. Напишите, если вам нужны особые примеры.

0 голосов
/ 17 февраля 2012

Другой простой способ - использовать регулярные выражения:

Pattern pattern = Pattern.compile("<Person>.*?<Name>(.*?)</Name>.*?<LastName>(.*?)</LastName>.*?</Person>", Pattern.MULTILINE | Pattern.DOTALL);
Matcher matcher = pattern.matcher(xml);
while (matcher.find())
{
  String name = matcher.group(1);
  String lastName = matcher.group(2);
}

Сохраните имя и фамилию в своей собственной структуре данных о персонах.

Определите команду Pattern.compile как константу вне вашего метода, поскольку для ее инициализации требуется время.

Пожалуйста, смотрите http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

0 голосов
/ 16 февраля 2012

XPath является одним из решений,

если вы не хотите использовать другую библиотеку ...

Чем пытаться определить DTD и использовать параметр ID, большинство анализаторов имеют функцию getElementById (ID)

...