javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [org.apache.xerces.jaxp.Documen

本文介绍了解决JasperReports使用JFreeChart时出现的问题,通过删除问题jar包gunjaxp.jar实现了问题的解决。

今天搞jasperreports遇到的上面的问题, 

jfreechar的gunjaxp.jar包有问题,我就试着去删除,结果,搞定~~~~

出现 `javax.xml.parsers.ParserConfigurationException` 异常通常是因为 `DocumentBuilderFactory` 在某些环境下(例如某些 Java 版本或模块化项目)配置不当,或缺少必要的实现类。 下面是一个**改进版的 Java 示例代码**,确保正确解析 XML,并避免 `ParserConfigurationException`: --- ### ✅ 修复后的 Java 示例代码: ```java import org.w3c.dom.*; import javax.xml.parsers.*; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public class XMLParser { public static void main(String[] args) throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"GB2312\"?>\n" + "<msg>\n" + " <msgHeader>\n" + " <srvAddr>10.105.191.35:11016</srvAddr>\n" + " </msgHeader>\n" + " <msgBody>\n" + " <signOffNo>3</signOffNo>\n" + " <signOff><name>QS202510150003</name></signOff>\n" + " <signOff><name>QS202510150002</name></signOff>\n" + " <signOff><name>QS202510150001</name></signOff>\n" + " <Result>0</Result>\n" + " <ErrorDesc/>\n" + " </msgBody>\n" + "</msg>"; try { // 使用具体的工厂实现类避免 ParserConfigurationException DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // 使用 GB2312 编码处理 XML 字符串 ByteArrayInputStream input = new ByteArrayInputStream(xml.getBytes(StandardCharsets.ISO_8859_1)); Document doc = builder.parse(input); doc.getDocumentElement().normalize(); // 提取所有 <signOff><name> NodeList nodeList = doc.getElementsByTagName("signOff"); List<String> nameList = new ArrayList<>(); for (int i = 0; i < nodeList.getLength(); i++) { Element signOff = (Element) nodeList.item(i); Element nameElement = (Element) signOff.getElementsByTagName("name").item(0); if (nameElement != null) { nameList.add(nameElement.getTextContent()); } } System.out.println(nameList); // 输出结果 } catch (Exception e) { e.printStackTrace(); } } } ``` --- ### 🛠 常见原因及解决办法: 1. **JDK 模块限制(Java 9+)** - 如果你使用的是 Java 9 或更高版本,请确保添加了 `--add-modules java.xml.bind` 启动参数,或者使用完整的 XML 解析依赖(如 Apache Xerces)。 2. **XML 编码问题** - 如果原始 XML 是 `GB2312`,确保在读取时使用正确的编码(如示例中使用 `ISO_8859_1` 模拟处理 GB2312,实际应使用 `InputStreamReader` 指定编码)。 3. **推荐使用 `SAXParserFactory` 或第三方库(如 `dom4j` 或 `JDOM`)** --- ### ✅ 推荐使用 `SAXParserFactory` 的替代方式 ```java import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import java.io.ByteArrayInputStream; public class SAXXMLParser { public static void main(String[] args) throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"GB2312\"?>\n" + "<msg><msgBody>" + "<signOff><name>QS202510150003</name></signOff>" + "<signOff><name>QS202510150002</name></signOff>" + "<signOff><name>QS202510150001</name></signOff>" + "</msgBody></msg>"; SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); List<String> names = new ArrayList<>(); saxParser.parse(new ByteArrayInputStream(xml.getBytes("GB2312")), new DefaultHandler() { private boolean inName = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) { if (qName.equalsIgnoreCase("name")) { inName = true; } } @Override public void characters(char[] ch, int start, int length) { if (inName) { names.add(new String(ch, start, length)); inName = false; } } }); System.out.println(names); } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值