Java中解析小型XML文档或字符串应选择哪款XML解析器?
Java环境下解析小型XML字符串的推荐方案
针对你仅需要提取标签属性、XML规模极小的场景,优先选择开发成本低、无冗余依赖的解析方案,具体推荐优先级如下:
1. 首选:JDK内置javax.xml.xpath API
无需引入任何第三方依赖,仅需几行代码即可完成属性提取,是短XML取值场景的最优选择:
import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import org.xml.sax.InputSource; import java.io.StringReader; public class XmlParseDemo { public static void main(String[] args) throws Exception { // 待解析的XML字符串 String xmlContent = "<root><user id=\"1001\" name=\"张三\" age=\"25\"/></root>"; XPath xPath = XPathFactory.newInstance().newXPath(); // 编写XPath表达式直接提取user标签的id属性 String userId = xPath.evaluate("//user/@id", new InputSource(new StringReader(xmlContent))); System.out.println(userId); // 输出1001 } }
该方案的优势:
- 完全基于JDK内置能力,无需额外引入依赖,不会增加项目体积
- 开发效率极高,仅需编写对应XPath表达式即可直接获取目标值,无需手动遍历节点
- 性能开销极低,完全适配小型XML场景的需求
注意:如果需要解析不可信来源的XML,可给XPathFactory增加关闭外部实体的配置避免XXE漏洞,你当前自用的短XML场景无需额外配置。
2. 备选:JDK内置DOM解析器
如果你需要同时操作多个节点,也可以选择JDK自带的DOM解析方案:
import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.StringReader; import org.xml.sax.InputSource; public class DomParseDemo { public static void main(String[] args) throws Exception { String xmlContent = "<root><user id=\"1001\" name=\"张三\" age=\"25\"/></root>"; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xmlContent))); Element userElement = (Element) doc.getElementsByTagName("user").item(0); String userName = userElement.getAttribute("name"); System.out.println(userName); // 输出张三 } }
3. 已有第三方依赖的场景选择
如果你的项目已经引入了dom4j、jackson-dataformat-xml这类通用XML处理库,直接使用对应库的API即可,无需再混用JDK原生API:
- dom4j可通过
SAXReader直接读取XML字符串转成Document对象,再调用attributeValue()方法提取属性 - jackson-dataformat-xml可直接将XML反序列化为Java对象,适合属性较多的场景
不推荐方案
不要选择SAX、StAX这类流式解析器,这类方案虽然性能更高,但开发成本远高于上述方案,对于仅4个标签的小型XML来说完全没有必要,性能优势也无法体现,属于过度设计。
内容的提问来源于stack exchange,提问作者Amritesh Singh
相关产品推荐
相关产品推荐

