当前位置: 首页 > 面试题库 >

解析没有根元素的XML流

冯育
2023-03-14
问题内容

我需要解析一个连续的格式良好的XML元素流,仅向其提供一个已经构造的java.io.Reader对象。这些元素没有包含在根元素中,也没有以XML标头开头,例如<?xml version="1.0"?>",但它们都是有效的XML。

使用Java org.xml.sax.XMLReader类是行不通的,因为XML
Reader希望从封闭的根元素开始解析格式良好的XML。因此,它只是读取流中的第一个元素(它被视为根元素),而在下一个元素中失败,使用典型

org.xml.sax.SAXParseException:根元素后面的文档中的标记必须格式正确。

对于不包含根元素但存在或可以定义根元素的文件(称为MyRootElement),文件可以执行以下操作:

        Strint path = <the full path to the file>;

        XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();

        StringBuilder buffer = new StringBuilder();

        buffer.append("<?xml version=\"1.0\"?>\n");
        buffer.append("<!DOCTYPE MyRootElement ");
        buffer.append("[<!ENTITY data SYSTEM \"file:///");
        buffer.append(path);
        buffer.append("\">]>\n");
        buffer.append("<MyRootElement xmlns:...>\n");
        buffer.append("&data;\n");
        buffer.append("</MyRootElement>\n");

        InputSource source = new InputSource(new StringReader(buffer.toString()));

        xmlReader.parse(source);

我已经通过将部分java.io.Reader输出保存到文件中来测试了上述内容,并且可以正常工作。但是,这种方法不适用于我的情况,并且无法插入此类额外的信息(XML标头,根元素),因为java.io.Reader已经构造了传递给我的代码的对象。

本质上,我正在寻找“碎片化的XML解析”。因此,我的问题是,可以使用标准Java
API(包括org.sax.xml.*java.xml.*程序包)完成此操作吗?


问题答案:

SequenceInputStream可以解决:

    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    SAXParser parser = saxFactory.newSAXParser();

    parser.parse(
        new SequenceInputStream(
            Collections.enumeration(Arrays.asList(
            new InputStream[] {
                new ByteArrayInputStream("<dummy>".getBytes()),
                new FileInputStream(file),//bogus xml
                new ByteArrayInputStream("</dummy>".getBytes()),
            }))
        ), 
        new DefaultHandler()
    );


 类似资料:
  • 问题内容: 我正在尝试在一个郊区的数据库中搜索所有属性。我已经读到它与HTML代码204有关,但我仍然不了解该做什么或真正意味着什么。我有一段时间没有做过任何JS或PHP了,所以这可能是一个很愚蠢的错误,但是我一生都无法解决。请帮忙! 这是我的JS代码: 这是我的PHP代码: 提前致谢。 问题答案: 错误是浏览器的编译器正在“注释”所有php,并添加了空HTML标记。然后,由于有一个“空”文档而变

  • 我在返回带有指定对象根名的对象列表时遇到了一些麻烦。我试过几种不同的方法。我确信我正在做一件像往常一样难以置信的愚蠢的事情,我很感激任何帮助。 这是我的东西

  • 假设我有以下XML模型: 如果我将类以下约定重命名为: 这两种元素都是: 来自的XML 看起来像这样: 但我希望它看起来像这样: 我做错什么了吗?我看到我可以使用@JsonProperty,它可以工作,但只适用于字段,我觉得在XML元素上使用JsonProperty是错误的。我的模型类可以命名为CUSTOMER、PERSON、USER吗?或者我应该重命名它们吗?如果重命名它们更好,我应该使用Jso

  • 本文向大家介绍Python解析xml中dom元素的方法,包括了Python解析xml中dom元素的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python解析xml中dom元素的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 我目前正在使用SAX(Java)来解析少量不同的XML文档,每个文档代表不同的数据,并且结构略有不同。因此,每个XML文档都由不同的SAX类(子类)处理。 但是,在所有这些不同的文档中可能会出现一些XML结构。理想情况下,我想告诉解析器“嘿,当你到达一个元素,只要使用阅读它,并给我回的结果。如果你达到,使用读它,并给我回的是结果”。 但是,我看不到这样做的明显方法。 我是否应该只制作一

  • 问题内容: 我有这样的XML结构: 我不知道如何收集SubItemField元素的值和属性,我的代码是这样的: 我需要属性和值,但是获取我知道的值的唯一方法就是使用 而不是我的自定义类型。我正在使用xml.Unmarshal btw。 任何想法? 谢谢。 问题答案: 我想出了如何做到这一点,我只需要在结构中添加一个匹配的新属性即可,如下所示: 我希望这可以帮助某人,因为没有相关文档或示例。