当前位置: 首页 > 知识库问答 >
问题:

使用JAXB解组时格式错误的XML

萧无尘
2023-03-14

编辑:感谢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、...)都在架构中定义。

共有2个答案

齐财
2023-03-14

您的xml格式不正确,您的头应该如下所示(xmlns和schemaLocation是根节点的属性,而不是单独的元素):

    <?xml version="1.0" encoding="UTF-8"?>  
    <root_element xmlns="uri to ns" 
              xmlns:xsi="uri_to schema instance" 
              xsi:schemaLocation="uri to schema location">
...
    </root_element>

查看以下链接了解更多信息:

法语的一般xml教程 - 基于“fichier_erreur”,我想这是您的首选语言

如何为schemaLocation引用本地文件

刘成礼
2023-03-14

您拥有的 XML 确实格式不正确,因为您可以在此处在线测试以进行验证。您的 XML 提供的是 XML 主体中的多个根节点/元素,因为应该只有一个 XML 主体,并且 xmlns:xsi 和 xsi: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类使用从一个xsd,其中根元素是类型的。 jaxb生成的根元素是 当我尝试解组与该xsd对应的xml并强制转换JaxbElement时,它会引发一个强制转换异常: 片段:

  • 我正在使用JAXB/MOXY解组包含约50个此类对象的XML文件: BR

  • 问题内容: 我想使用Javascript 解析此内容。数据如下所示: 在线上的每个教程都教您如何使用Twitter解析JSON,但是我不太确定如何使用JSON解析。 我想在一个网站上进行设置,以查看NFL团队在一个有趣的项目中获得的分数,以及有关解析JSON的良好学习体验,因为我不太在乎Twitter的东西。 这可能吗?有什么好的入门教程吗?甚至一些起始代码? 问题答案: 一般来说,您可以使用 J

  • 问题内容: 我是JAXB的新手,并且想知道是否有一种方法可以使用xpath表达式将XML解组到我的响应对象。问题是我正在呼叫第三方Web服务,收到的响应有很多详细信息。我不希望将XML中的所有详细信息映射到我的响应对象。我只希望从xml映射一些细节,使用这些细节我可以使用特定的XPath表达式并将其映射到我的响应对象。有没有注释可以帮助我实现这一目标? 例如考虑以下响应 我只对检索街道名称感兴趣,

  • 我是JAXB新手,想知道是否有一种方法可以使用xpath表达式将XML解组到响应对象。问题是我正在呼叫第三方Web服务,我收到的回复有很多详细信息。我不希望将XML中的所有细节映射到我的响应对象。我只希望映射xml中的一些细节,使用特定的XPath表达式可以获得这些细节,并将其映射到响应对象。有没有注释可以帮助我实现这一点? 例如,考虑以下响应 我只对检索街道名称感兴趣,所以我想使用xpath表达

  • 问题内容: 目前,我正在开发一项功能,该功能涉及解析从另一产品收到的XML。我决定对一些实际的客户数据进行一些测试,看起来其他产品正在允许来自用户的输入被认为是无效的。无论如何,我仍然必须尝试找出一种解析它的方法。我们正在使用,但输入出现错误,如下所示。 如你所知,说明中包含似乎是无效标签的内容。现在,此描述标签被称为是叶子标签,并且其中不应包含任何嵌套标签。无论如何,这仍然是一个问题,并且会在