我需要使用java读取XML文件中单个属性的值。 XML看起来像这样:
<behavior name="Fred" version="2.0" ....>
我只需要读出版本。有人可以指向资源的方向,告诉我如何做到这一点?
答案 0 :(得分:3)
您不需要花哨的库 - DOM和XPath的普通旧JAXP版本非常容易阅读和写入。无论你做什么,都不要使用正则表达式。
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
public class GetVersion {
public static void main(String[] args) throws Exception {
XPath xpath = XPathFactory.newInstance().newXPath();
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse("file:////tmp/whatever.xml");
String version = xpath.evaluate("//behavior/@version", doc);
System.out.println(version);
}
}
答案 1 :(得分:2)
JAXB为了简洁起见:
private static String readVersion(File file) {
@XmlRootElement class Behavior {
@XmlAttribute String version;
}
return JAXB.unmarshal(file, Behavior.class).version;
}
效率StAX:
private static String readVersionEfficient(File file)
throws XMLStreamException, IOException {
XMLInputFactory inFactory = XMLInputFactory.newInstance();
XMLStreamReader xmlReader = inFactory
.createXMLStreamReader(new StreamSource(file));
try {
while (xmlReader.hasNext()) {
if (xmlReader.next() == XMLStreamConstants.START_ELEMENT) {
if (xmlReader.getLocalName().equals("behavior")) {
return xmlReader.getAttributeValue(null, "version");
} else {
throw new IOException("Invalid file");
}
}
}
throw new IOException("Invalid file");
} finally {
xmlReader.close();
}
}
答案 2 :(得分:1)
这是one。
import javax.xml.parsers.SAXParser;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
import javax.xml.parsers.SAXParserFactory;
/**
* Here is sample of reading attributes of a given XML element.
*/
public class SampleOfReadingAttributes {
/**
* Application entry point
* @param args command-line arguments
*/
public static void main(String[] args) {
try {
// creates and returns new instance of SAX-implementation:
SAXParserFactory factory = SAXParserFactory.newInstance();
// create SAX-parser...
SAXParser parser = factory.newSAXParser();
// .. define our handler:
SaxHandler handler = new SaxHandler();
// and parse:
parser.parse("sample.xml", handler);
} catch (Exception ex) {
ex.printStackTrace(System.out);
}
}
/**
* Our own implementation of SAX handler reading
* a purchase-order data.
*/
private static final class SaxHandler extends DefaultHandler {
// we enter to element 'qName':
public void startElement(String uri, String localName,
String qName, Attributes attrs) throws SAXException {
if (qName.equals("behavior")) {
// get version
String version = attrs.getValue("version");
System.out.println("Version is " + version );
}
}
}
}
答案 3 :(得分:1)
如前所述,您可以使用SAXParser。
Digester提到使用正则表达式,我不建议这样做会导致难以维护的代码:如果在另一个标记或其他行为标记中添加另一个版本属性该怎么办?你可以处理它,但它不会很漂亮。
您还可以使用XPath,这是一种查询xml的语言。这就是我的建议。
答案 4 :(得分:0)
如果您只需要阅读该版本,那么您可以使用正则表达式。但实际上,我认为你需要apache digester
答案 5 :(得分:0)
Apache Commons Configuration也很好。 Commons Digester以此为基础。