我正在尝试从xml文档中检索值。 XML大小高达3GB。所以我选择使用java的StaX解析器。 在这里,我使用下面的代码来检索标签之间的值。 如果我执行代码,那么我从一个标签获得值。 我想要三个Tag值。
<Author>
<Number>1</SequenceNumber>
<Role>B01</ContributorRole>
<Name>Klaus Misgeld</PersonName>
<NameInverted>Misgeld, Klaus</PersonNameInverted>
<BeforeKey>Klaus</NamesBeforeKey>
<KeyNames>Misgeld</KeyNames>
</Author>
<Author>
<Number>2</SequenceNumber>
<Role>B01</ContributorRole>
<Name>Karl Molin</PersonName>
<NameInverted>Molin, Karl</PersonNameInverted>
<BeforeKey>Karl</NamesBeforeKey>
<KeyNames>Molin</KeyNames>
</Author>
<Author>
<Number>3</SequenceNumber>
<Role>B01</ContributorRole>
<Name>Klas Amark</PersonName>
<NameInverted>Amark, Klas</PersonNameInverted>
<BeforeKey>Klas</NamesBeforeKey>
<KeyNames>Amark</KeyNames>
</Author>
Same XML Tag...
如何从同一个xml标记中检索值?
我试过了 XMLReader.java
XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));
while(xmlEventReader.hasNext()){
XMLEvent xmlEvent = xmlEventReader.nextEvent();
if (xmlEvent.isStartElement()){
StartElement startElement = xmlEvent.asStartElement();
if(startElement.getName().getLocalPart().equals("Product")){
emp = new BookSpecBean();
}
//set the other varibles from xml elements
if(startElement.getName().getLocalPart().equals("Author")){
else if(startElement.getName().getLocalPart().equals("Number")){
xmlEvent = xmlEventReader.nextEvent();
emp.setSequencenumberchar(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("Role")){
xmlEvent = xmlEventReader.nextEvent();
emp.setContributorrolechar(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("Name")){
xmlEvent = xmlEventReader.nextEvent();
emp.setPersonnamechar(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("NameInverted")){
xmlEvent = xmlEventReader.nextEvent();
emp.setPersonnameinvertedchar(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("BeforeKey")){
xmlEvent = xmlEventReader.nextEvent();
emp.setNamebeforekeychar(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("KeyNames")){
xmlEvent = xmlEventReader.nextEvent();
emp.setKeynameschar(xmlEvent.asCharacters().getData());
它检索单个值。 如何检索所有三个标签值。 我正在使用StaX解析器。 谢谢你的回答..
答案 0 :(得分:0)
你的问题不明确。您的XML不是well-formed(例如<Number>...</SequenceNumber>
)。目前尚不清楚“三个标签值”是什么意思。我认为你想得到所有3位作者。
我不知道您的代码是如何组织的。我认为以下内容可行。
您的班级BookSpecBean
必须包含Author
个对象的列表。然后,您可以在XML中添加尽可能多的Author
。
class BookSpecBean {
private final List<Author> authors;
public BookSpecBean() {
authors = new ArrayList<Author>();
}
public void addAuthor(Author a) {
authors.add(a);
}
public List<Author> getAllAuthors() {
return authors;
}
// ... and more fields ...
}
class Author {
public String getRole() { ... }
public void setRole(String role) { ... }
public int getNumber() { ... }
public void setNumber(int n) { ... }
// ... and more fields ...
}
class BookSpecXmlReader {
public BookSpecBean readBookSpec(XMLEventReader reader) {
BookSpecBean book = new BookSpecBean();
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if (event.isStartElement()) {
StartElement startEl = event.asStartElement();
String elementName = startEl.getName().getLocalPart();
if (elementName.equals("Author")) {
book.addAuthor(readAuthor(reader));
}
} else if (event.isEndElement()) {
EndElement endEl = event.asEndElement();
if (endEl.getName().getLocalPart().equals("Product")) {
return book;
}
}
}
}
private Author readAuthor(XMLEventReader reader) {
Author author = new Author();
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if (event.isStartElement()) {
StartElement startEl = event.asStartElement();
String elementName = startEl.getName().getLocalPart();
if (startEl.equals("Role")) {
author.setRole(reader.nextEvent().asCharacters().getData());
} else if (startEl.equals("Number")) {
author.setNumber(Integer.parseInt(
reader.nextEvent().asCharacters().getData()));
}
} else if (event.isEndElement()) {
EndElement endEl = event.asEndElement();
if (endEl.getName().getLocalPart().equals("Author")) {
return author;
}
}
}
}
}