gpt4 book ai didi

java - 使用 JAXB 解码时 XML 格式错误

转载 作者:行者123 更新时间:2023-12-02 03:27:43 26 4
gpt4 key购买 nike

编辑:感谢 Preetam Kumar,这个问题已经解决,但错误现在在其他地方。当我尝试再次解码 xml 文件时,出现此错误,告诉我找不到该元素:

javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException; systemId: file:***/Workspace_XML/fichier_cri/xml/exemple1.xml; lineNumber: 5; columnNumber: 185; cvc-elt.1 : Declaration of element 'crifile' cannot be found.]

但是,我为 xml 文件提供了模式的正确路径,但它似乎没有使用它......我不明白。

注意:我知道下面的示例中的架构和 xml 标签并不完全匹配,我已经在我的文件中更正了它。

<小时/>

这些天我必须使用 JAXB java 库将一些 XML 文件解析为 Java 对象。

我制作了一个 XML 架构 (.xsd) 并使用工具 xjc 对其进行编译并生成我的 Java 类。 (有关 xsd 文件的示例,请参阅我的问题:schema.xsd)

现在,我尝试通过解码自定义 XML 文件来测试我的架构和生成的类。这是我的问题。当我声明命名空间时,我不断收到一个错误,表明我的 xml 从一开始就格式错误,正如我在许多网站和示例中看到的那样:

<?xml version="1.0" encoding="UTF-8"?> 
<xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<xsi:schemaLocation="***\Workspace_XML\fichier_cri\schema.xsd"/>

我收到错误:

javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException; systemId: file:***/Workspace_XML/fichier_cri/xml/exemple1.xml; lineNumber: 2; columnNumber: 11; The type of element "xmlns:xsi" must be followed by attribut specifications, ">" or "/>".]

我尝试修改该行,甚至将其删除,但随后出现另一个错误:

javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException; systemId: file:***/Workspace_XML/fichier_cri/xml/exemple1.xml; lineNumber: 5; columnNumber: 10; cvc-elt.1 : Déclaration of element 'crifile' not found.]

现在,我不知道该怎么办了,所以如果有人有提示或什么,我不会拒绝......

我对我的 Java 测试程序也不太有信心...但它是:

import generated.FichierCri;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import org.xml.sax.SAXException;

public class main {

final static File baseDir = new File("***\\Workspace_XML\\fichier_cri\\");

public static void main(String[] args) {

System.out.println("*DEBUG* - load xml stream");
System.out.println("*DEBUG* - xml file location : " + baseDir.getPath() + "\\xml\\exemple1.xml");

File xmlFile = new File(baseDir, "\\xml\\exemple1.xml");

if (xmlFile == null)
throw new NullPointerException("xmlFile is null");

System.out.println("*DEBUG* - Instantiate SchemaFactory");

SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

System.out.println("*DEBUG* - Load schema file");
System.out.println("*DEBUG* - schema location : " + baseDir.getPath() + "\\schema\\schema.xsd");

Schema schema = null;
try {
schema = schemaFactory.newSchema(new File(baseDir, "\\schema\\schema.xsd"));
}
catch (SAXException e) {
e.printStackTrace();
}

if (schema == null) throw new NullPointerException("schema is null");

System.out.println("*DEBUG* - Instantiate JAXBContext");

JAXBContext context = null;
try {
context = JAXBContext.newInstance(FichierCri.class);
}
catch (JAXBException e) {
e.printStackTrace();
}

System.out.println("*DEBUG* - create unmarshaller");

Unmarshaller unmarshaller = null;
try {
unmarshaller = context.createUnmarshaller();
}
catch (JAXBException e) {
e.printStackTrace();
}

System.out.println("*DEBUG* - set schema to unmarshaller");

unmarshaller.setSchema(schema);

System.out.println("*DEBUG* - Create unmarshall object of type FichierCri");
System.out.println("*DEBUG* - unmarshall from xml file");

try {
FichierCri unmarshall = (FichierCri) unmarshaller.unmarshal(xmlFile);
}
catch (JAXBException e) {
e.printStackTrace();
}
}
}

这是 xml 文件的示例:

<?xml version="1.0" encoding="UTF-8"?> 
<xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<xsi:schemaLocation="***\Desktop\Workspace_XML\fichier_cri\schema.xsd"/>

<crifile>
<init_liaison>
<source>value</source>
</init_liaison>
<liste_cri>
<demande_cri>
<fichier_erreur>value</fichier_erreur>
</demande_cri>
</liste_cri>
</crifile>

所有元素(crifile、liste_cri...)均在架构中定义。

最佳答案

您拥有的 XML 确实格式错误,您可以在线测试 here for validation 。您的 XML 提供的是 XML 主体中的多个根节点/元素,因为应该只有一个 XML 主体,并且 xmlns:xsixsi:schemaLocation 应该属于唯一的根元素,在您的情况下是 crifile 元素。

修正后您的 XML 应如下所示:

<?xml version="1.0" encoding="UTF-8"?> 
<crifile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="PATH_TO_SCHEMA_FILE\schema.xsd">
<init_liaison>
<source>value</source>
</init_liaison>
<liste_cri>
<demande_cri>
<fichier_erreur>value</fichier_erreur>
</demande_cri>
</liste_cri>
</crifile>

其中 PATH_TO_SCHEMA_FILE 应替换为架构文件的正确位置。

关于java - 使用 JAXB 解码时 XML 格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38585955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com