2012-02-16 5 views
-1

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

Я получил класс 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)

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

Благодаря

ответ

1

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

0

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

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

Чем попробовать определение ОТД и с помощью параметра ID, большинство парсеров имеют getElementById (ID) funciton

1

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

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

+0

спасибо, им новое для Java, может у пожалуйста, покажите мне пример кода? Спасибо за вашу помощь – ibm123

+0

Поскольку вы новичок в java, я добавляю новый ответ, как использовать регулярные выражения в этом примере. Как насчет этого? – ZehnVon12

+0

Спасибо за внимание, я рассмотрю ваш ответ – ibm123

1

Ненавижу просто оставить это здесь, но я ответил на аналогичный вопрос here.

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

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

Вы пишете такие правила, как «/ root/Персоны/список/Лицо/Имя», и дайте ему свой документ, и он будет срабатывать каждый раз, когда он набирает имя, и вызывать вызываемый пользователем обратный вызов для вас, передавая вам его имя найденный.

Вы создаете несколько правил для всех желаемых значений и альта ... вы можете создать правило START_TAG для открытого тега «/ root/Персоны/список/Личность» и создать новый «Person p = новый 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 и все элементы узла для создания списка.

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

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

+1

JAXB не требует XML-схемы. Вы можете начать с классов Java и добавлять аннотации для настройки представления XML: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics –

+1

Doh, забыл об аннотациях. Хорошая коррекция @BlaiseDoughan. В прошлый раз я использовал JAXB между ним и Castor с некоторыми довольно сложными схемами, поэтому я немного из цикла с ним. –

0

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

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