我正在尝试解析一个包含符合XML 1.1 规范的XML 内容的字符串。XML 包含在 XML 1.0 规范中不允许但在 XML 1.1 规范中允许的字符引用(转换为 U+0001–U+001F 范围内的 Unicode 字符的字符引用)。
根据 Xerces2 网站, Xerces2 解析器支持解析 XML 1.1 文档。但是,我不知道如何告诉它我们试图解析的 XML 包含符合 1.1 的 XML。
我正在使用 DocumentBuilder 来解析 XML(类似这样):
public Element parseString(String xmlString) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
InputSource source = new InputSource(new StringReader(xmlString));
// Throws org.xml.sax.SAXParseException becuase of the invalid character refs
Document doc = documentBuilder.parse(source);
return doc.getDocumentElement();
} catch (ParserConfigurationException pce) {
// Handle the error
} …
Run Code Online (Sandbox Code Playgroud) 我有 XSD,它在模式生成过程中出现以下错误。
org.xml.sax.SAXParseException; systemId: file:/D:/Basil/Projects/myproducts.xsd; lineNumber: 577; columnNumber: 50; cos-all-limited.1.2: An 'all' model group must appear in a particle with '{'min occurs'}' = '{'max occurs'}' = 1, and that particle must be part of a pair which constitutes the '{'content type'}' of a complex type definition.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:4124)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:4107)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:588)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:555)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:521)
at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:240)
at com.sun.tools.xjc.reader.xmlschema.parser.SchemaConstraintChecker.check(SchemaConstraintChecker.java:101)
at com.sun.tools.xjc.ModelLoader.loadXMLSchema(ModelLoader.java:357)
at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:167)
at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:113)
at com.sun.tools.xjc.Driver.run(Driver.java:313)
at org.codehaus.mojo.jaxb2.AbstractXjcMojo.execute(AbstractXjcMojo.java:298)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
Run Code Online (Sandbox Code Playgroud)
下面粘贴了相关的XSD。我无法理解实际的错误是什么。错误在最后的第三行。请帮忙。
<xs:group …
Run Code Online (Sandbox Code Playgroud) 我有一个调用Web服务的客户端,我正在收回一个ElementNSImpl
对象.是否可以将此对象转换为String?
对于一个org.w3c.dom.Document
对象,我使用过这样的代码:
protected static String documentToString(final Document doc) {
// outputs a DOM structure to plain String
try {
StringWriter sw = new StringWriter();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(doc), new StreamResult(sw));
return sw.toString();
} catch (Exception ex) {
throw new RuntimeException("Error converting to String", ex);
}
}
Run Code Online (Sandbox Code Playgroud) 在此先感谢任何帮助......
我遇到了对DTD验证失败的XML文件的问题(通过ant xmlvalidate
任务),但XML文档中报告的错误与正在验证的文档的内容不匹配.此外,在Oxygen中打开的相同文件验证没有问题.
报告错误的ant输出示例如下:
[xmlvalidate] /Path/to/file.xml:240:91: Attribute "match_style" with value "ble" must have a value from the list "any all none ".
Run Code Online (Sandbox Code Playgroud)
在目视检查有问题的文件时,第match_style
240行的属性值为all
.对文件的搜索显示该字符串ble
虽然在文档中确实发生了多次(作为table
in标签的子字符串,也enable
作为属性名称),但在第145和328行之间根本不出现.
我尝试过手动编辑XML文件并重新验证.如果我从文件前面删除换行符或其他空格(有时候我添加换行符)而不是报告的错误(不进行其他更改),它偶尔会完全解决问题,然后文件将验证.在其他情况下,它仍然失败,但错误是在文件的下方,并且对更接近新错误的空格的额外编辑将修复事情或者进一步向下移动"错误".我无法辨别任何押韵或理由,这些编辑将修复什么,哪些不会.
只是重复一个重点:有时更改空格并且不进行其他更改会导致文件验证.
我已经在XML文件中搜索了可能会做奇怪事情的隐形和控制字符,但除了花园种类的空白外,还没有找到任何其他内容.
这些文件是通过XSLT 2.0转换从各种其他XML版本的源文件生成的.转换是通过Java
使用Saxon 的任务在ant构建中完成的.(我无法使XSLT
任务或Saxon
任务按预期工作,因为我的XSL在某些情况下会从单个源文件生成多个结果文档,除了第一个结果文档之外的所有文档似乎总是被这些任务省略. )这是任务:
<java classname="net.sf.saxon.Transform" fork="true"
output="${dest.dir}/build"
resultproperty="transform_result"
failonerror="true">
<arg line="-o ${dest.dir}/ ${source.dir}/xml_sources ${source.dir}/xsl/transform.xsl"/>
</java>
Run Code Online (Sandbox Code Playgroud)
我还搜索了XSL和源XML文件以寻找不寻常的字符,并在XSL中使用字符映射并在结果文档中缩进以确保没有奇怪的空白字符.没有发现任何奇怪的东西,而且角色映射或缩进制作的唯一差异与手动编辑空白基本相同 - "错误"有时会四处移动,但仍然会发生.
我尝试过使用不同版本的Saxon和不同版本的Ant,没有不同的结果.问题开始了一段时间(不完全确定何时),但一切都曾经使用过一次,所以我尝试使用旧版本的XSL和源代码,但没有发现旧版本的东西没有显示问题(虽然由于从CVS切换到SVN,并且CVS不再存在,我可能根本无法回到足够远,因为现在丢失了一些最旧的修订版).
文件必须验证的DTD不是我的 - 我无法更改它或切换到架构.
我通常在Mac上工作(当前运行10.7.5),但问题也发生在Linux上(不确定是什么版本).我真的无法使用的一个变量是Java.当事情上次正常工作时,我可能已经运行了Java 1.5 - 我现在使用的是1.7,它确实发生在我运行1.6时.我不能在我有的机器上回到1.5.
这就是我能想到的所有可能相关的信息.
这个问题让我斗智斗勇.在我的所有研究中,我从未听说过其他人报告同样的问题,更不用说解决它了.任何关于可能出错的想法都会受到极大的赞赏.
谢谢!
我遇到了 Xerces 库的一些问题,我依赖的第三方库使用了它。
Xerces 尚不支持 JAXP 1.5,JAXP 1.5 包含在最新版本的 JDK 1.7 和 JDK 8 中。如果将 Xerces 用作 XML 解析器,这会导致一些问题,当系统知道多个 XML 解析器时可能会发生这种情况。删除xercesImpl-v2.9.0.jar
立即解决了问题,但随后第 3 方库不再工作。
我可以看到该问题的两种解决方案:
似乎实际使用的 Xerces 库中唯一的位是org.apache.xerces.util.XMLCatalogResolver
, 在CustomResolver.java
. 目录解析器是否有其他选项而不是 Xerces 选项?
另一种选择似乎是在 JVM 启动时为 XML 解析显式设置系统属性。这样 JVM 就可以告诉要使用哪个 XML 解析器,并且它不会再选择 Xerces。
我发现了以下三个属性:
-Djavax.xml.transform.TransformerFactory
-Djavax.xml.parsers.SAXParserFactory
-Djavax.xml.parsers.DocumentBuilderFactory
Run Code Online (Sandbox Code Playgroud)
不过,这会导致两个问题:
我使用以下代码来缩进作为字符串提供给我的 xml 文档。
我正在使用 的 JDK 实现org.w3c.dom.ls
,如果这很重要的话。
http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/ls/package-summary.html
public String format(String xml) {
try {
final InputSource src = new InputSource(new StringReader(xml));
final Node document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src).getDocumentElement();
final Boolean keepDeclaration = Boolean.valueOf(xml.startsWith("<?xml"));
//May need this: System.setProperty(DOMImplementationRegistry.PROPERTY,"com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl");
final DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
final DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
final LSSerializer writer = impl.createLSSerializer();
writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE); // Set this to true if the output needs to be beautified.
writer.getDomConfig().setParameter("xml-declaration", keepDeclaration); // Set this to true if the declaration is needed …
Run Code Online (Sandbox Code Playgroud) 我使用java1.6
,jboss5.1
和Spring
行家3.2.5
在我project.I我得到
java.lang.ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl不能转换为javax.xml.parsers.DocumentBuilderFactory中
这是我的Pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.varun.batch</groupId>
<artifactId>myproject</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>myproject Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- Spring ORM support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.2.13.RELEASE</version>
</dependency>
<!-- Spring Batch -->
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>3.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-infrastructure</artifactId>
<version>3.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-local</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-http</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency> …
Run Code Online (Sandbox Code Playgroud) 我正在尝试根据 Android 设备上的 XSD 验证 XML 文件。
我用谷歌搜索了很多,找到了一些解决方案,例如xerces-for-android。在堆栈溢出中我发现了一些像这样的页面,建议避免javax.xml
。验证并为此目的使用 Xerces。
我在不同的地方进行了测试Android APIs(17, 20,25)
,但不幸的是我没有取得任何成功。
您能帮助我并建议一种替代方法吗?
在尝试解组XML数据的输入流时,我遇到了这个异常.这显然是Xerces库的一个问题,但我很难找到解决方案.我在带有Java 8的Glassfish服务器上运行带有EclipseLink的Java EE程序.我的REST服务中出现这种错误,它将XML输入流作为参数.我得到的错误是:
Caused by: java.lang.IllegalStateException: org.xml.sax.SAXNotRecognizedException: unrecognized feature http://javax.xml.XMLConstants/feature/secure-processing
at com.sun.xml.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:135)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:154)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:172)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:219)
Run Code Online (Sandbox Code Playgroud)
我已经看到这里发布的其他问题建议升级我正在使用的Xerces库,并让它成为最重要的依赖,所以Maven抓住了那个而不是其他一些库,但它还没有为我做好.我的POM文件的相关部分是:
<dependencies>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22.2</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xerces</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.2.GA</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>6.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId> …
Run Code Online (Sandbox Code Playgroud) 当我尝试使用 Xerces-c 验证 XML 时,我的应用程序有时会崩溃。
这是堆栈跟踪:
#0 0x000000000064ead0 in xercesc_3_2::XMLMutex::lock() ()
#1 0x000000000064eb32 in xercesc_3_2::XMLMutexLock::XMLMutexLock(xercesc_3_2::XMLMutex*) ()
#2 0x00000000005c8d5d in xercesc_3_2::XMLScanner::commonInit() ()
#3 0x00000000005c6ff7 in xercesc_3_2::XMLScanner::XMLScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#4 0x00000000006caf59 in xercesc_3_2::IGXMLScanner::IGXMLScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#5 0x00000000006858aa in xercesc_3_2::XMLScannerResolver::getDefaultScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#6 0x00000000005da3f8 in xercesc_3_2::AbstractDOMParser::initialize() ()
#7 0x00000000005da163 in xercesc_3_2::AbstractDOMParser::AbstractDOMParser(xercesc_3_2::XMLValidator*, xercesc_3_2::MemoryManager*, xercesc_3_2::XMLGrammarPool*) ()
#8 0x00000000005e81bc in xercesc_3_2::XercesDOMParser::XercesDOMParser(xercesc_3_2::XMLValidator*, xercesc_3_2::MemoryManager*, xercesc_3_2::XMLGrammarPool*) ()
#9 0x00000000004f0323 in KEventUtils::validateXML(std::string) (this=0xdbb030, xmlFile="/mnt/lprsResults3//2017/09/18/C01/P00C013-2017091803862.xml.1.xml") at src/KEventUtils.cpp:315
#10 0x00000000004c3861 in ACSTrigger::transcodeVideo(int) (this=0xdbe170, id=0) at src/acsTrigger.cpp:1314
#11 0x00000000004cacaa in …
Run Code Online (Sandbox Code Playgroud) xerces ×10
xml ×7
java ×5
validation ×3
xml-parsing ×2
xsd ×2
ant ×1
c++ ×1
gdb ×1
javax ×1
jax-rs ×1
jaxp ×1
jboss ×1
jboss5.x ×1
maven ×1
saxon ×1
web-services ×1
xerces-c ×1
xml-1.1 ×1
xmlschemaset ×1