我在android/java上用SAXParser等做一些简单的SAXParsing
它可以正确解析文件,但遇到某些特殊字符时会打嗝,例如,如果它解析下面的xml:
<?xml version="1.0" encoding="ISO-8859-1" ?><MTRXML version="1.0">
<GEOCODE key="pohj">
<LOC name1="Pohjantori" number="" city="Espoo" code="995" address="" type="1" category="poi" x="2544225" y="6674893" lon="24.79378" lat="60.18324" />
<LOC name1="Pohjois-Haaga" number="" city="Helsinki" code="41" address="" type="1" category="poi" x="2549164" y="6680186" lon="24.88405" lat="60.23018" />
<LOC name1="Pohjois-Leppävaara" number="" city="Espoo" code="50" address="" type="1" category="poi" x="2545057" y="6679240" lon="24.80974" lat="60.22216" />
Run Code Online (Sandbox Code Playgroud)
当它在最后一行遇到Pohjois-Leppävaara的ä时会打嗝.
它给出的错误是:
01-30 18:14:52.039: WARN/System.err(686): org.apache.harmony.xml.ExpatParser$ParseException: At line 5, column 24: not well-formed (invalid token)
Run Code Online (Sandbox Code Playgroud)
我确信SAXParser可以处理这些字符,但我相信我需要在某处设置一些编码等?
Java代码是这样的:
AXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = null;
try {
parser = factory.newSAXParser();
} catch …Run Code Online (Sandbox Code Playgroud) 我试图通过使用DOM验证器在Java中使用XSD验证我的XML.
虽然我手动地知道该文档确实有效,但DOM验证器还是对我说:
cvc-complex-type.3.2.2: Attribute <xsi:schemaLocation> is not allowed to appear in the element <people>
Run Code Online (Sandbox Code Playgroud)
我已经确定的是:
setNamespaceAware()被设置为true
的schemaLanguage是之前设置属性schemaSource
schemaLanguage设置为http://ww.w3.org/2001/XMLSchema
两者的XSD和XML在同一个文件夹中.java和.class文件
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class DOMValidator {
String xmlInstance = null;
String xmlSchema = null;
public static void main(String[] args){
DOMValidator validator = new DOMValidator();
validator.validateXML("student.xsd",
"helloWorld.xml");
}
public void validateXML(String xsd,String xml){
xmlSchema = xsd;
xmlInstance = xml;
beginValidation();
}
public …Run Code Online (Sandbox Code Playgroud) 我有一个 xml 文档:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Child name="MyType" compareMode="EQ"></Child>
</Root>
Run Code Online (Sandbox Code Playgroud)
我想在以下 xsd 的帮助下验证这个 xml:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Child">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="compareMode" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
当我尝试验证它时,我收到以下错误:
Exception in thread "main" org.xml.sax.SAXException: Validation failed against correct.xml. ErrorMessage:s4s-elt-schema-ns: The namespace of element 'Root' must be from the schema namespace, 'http://www.w3.org/2001/XMLSchema'.
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么Root必须在架构的命名空间中?那可能是我没有正确验证xml文档吗?
公共同步布尔值 isValid(String xmlFragment, File xmlSchema) 抛出 SAXException, IOException{
// …
所以我有大量的XML文件.多年来,他们造成了麻烦,因为写这些人的人手工完成,所以错误自然而然地发生了.我们现在应该验证它们并在尝试使用这些XML文件时提供有关错误的反馈.
我正在使用SAX解析器并获取错误列表.
以下是我的代码
BookValidationErrorHandler errorHandler = new BookValidationErrorHandler();
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
SchemaFactory schemaFactory =
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
factory.setSchema(schemaFactory.newSchema(
new Source[] {new StreamSource("test.xsd")}));
javax.xml.parsers.SAXParser parser = factory.newSAXParser();
org.xml.sax.XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(errorHandler);
reader.parse(new InputSource("bad.xml"));
Run Code Online (Sandbox Code Playgroud)
前几个错误始终是:
行号:2:文档无效:未找到语法.行号:2:文档根元素"信用",必须与DOCTYPE根"null"匹配.
我们不可能去编辑需要检查的数千个XML文件.
有什么我可以轻松添加到源的前面以防止这种情况吗?有没有办法告诉解析器忽略这些与DTD相关的错误?甚至不确定语法是什么意思.我有点理解第二个意味着什么.
为什么 SAXParseException 为 getSystemId() 返回 null?什么是系统标识符?
import java.io.StringReader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
public class MainClass {
static public void main(String[] arg) throws Exception{
boolean validate = false;
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(validate);
XMLReader reader = null;
SAXParser parser = spf.newSAXParser();
reader = parser.getXMLReader();
reader.setErrorHandler(new MyErrorHandler());
reader.parse(new InputSource(new StringReader(xmlString)));
}
static String xmlString = "<PHONEBOOK>" +
" <PERSON>" +
" <NAME>Joe Wang</NAME>" +
" <EMAIL>joe@yourserver.com</EMAIL>" +
" <TELEPHONE>202-999-9999</TELEPHONE>" +
" <WEB>www.java2s.com</WEB>" …Run Code Online (Sandbox Code Playgroud) 我有一个xsd文件和一个xml文件,我正在使用以下代码对xsd文件验证xml文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setAttribute(
"http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
factory.setAttribute(
"http://java.sun.com/xml/jaxp/properties/schemaSource",
new InputSource(new StringReader(xsd)));
Document doc = null;
try {
DocumentBuilder parser = factory.newDocumentBuilder();
MyErrorHandler errorHandler = new MyErrorHandler();
parser.setErrorHandler(errorHandler);
doc = parser.parse(new InputSource(new StringReader(xml)));
return true;
} catch (ParserConfigurationException e) {
System.out.println("Parser not configured: " + e.getMessage());
} catch (SAXException e) {
System.out.print("Parsing XML failed due to a "
+ e.getClass().getName() + ":");
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println("IOException thrown");
e.printStackTrace();
}
return false;
Run Code Online (Sandbox Code Playgroud)
MyErrorHanlder是
private static class …Run Code Online (Sandbox Code Playgroud) 我只是在android studio上构建一个应用程序,当我在模拟器上运行它时出现错误代码.需要你的帮助
这里的代码:
Error:Execution failed for task ':app:buildInfoDebugLoader'.
> Exception while loading build-info.xml : org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
at com.android.utils.XmlUtils.parseUtfXmlFile(XmlUtils.java:514)
at com.android.build.gradle.internal.incremental.InstantRunBuildContext.loadFromXmlFile(InstantRunBuildContext.java:626)
at com.android.build.gradle.internal.incremental.BuildInfoLoaderTask.executeAction(BuildInfoLoaderTask.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:632)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:615)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236) …Run Code Online (Sandbox Code Playgroud) SAXException由SAXNotRecognizedException,SAXNotSupportedException扩展 .
try {
//do Something
} catch(SAXException e) {}
catch(ParserConfigurationException pce) {}
Run Code Online (Sandbox Code Playgroud)
如果让我们说'做某事'有一些抛出的代码,SAXNotRecognizedException or SAXNotSupportedException如果发生这种情况,那么什么都不应该发生.如果发生SAXNotRecognizedException,那么因为它是一个空块,所以不会发生任何事情.同样适用于ParserConfigurationException.现在,即使我说没有为ParserConfigurationException做任何事情,也会抛出ParserConfigurationException的异常.
我基本上希望它在SAXNotRecognizedException or SAXNotSupportedException发生时什么都不做.
在更改原始源之前,我正在尝试访问wrapbootstrap.com模板的默认登录页面.在这个问题中解决了模板引擎的使用问题.
我的ViewResolver bean定义如下:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "b.c.m.h")
public class HConfiguration extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setTemplateMode("HTML5");
templateResolver.setPrefix("/WEB-INF/html/");
templateResolver.setSuffix(".html");
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver);
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
return viewResolver;
}
(...)
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试访问login.html由以下定义的页面时:
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginPage() {
return "login";
}
Run Code Online (Sandbox Code Playgroud)
而login.html页是:
<!DOCTYPE html>
<!--
Beyond Admin - Responsive Admin Dashboard Template build with …Run Code Online (Sandbox Code Playgroud)