java - 从 Html 字符串建模一个类,实例化该类并从该字符串填充变量,然后从该类返回 html 字符串

标签 java html xml jaxb xsd

这可能有点难以解释,但我正在尝试从 html 标记字符串创建一个 Java 类。我希望能够获取字符串并创建一个对象并用值填充所有成员变量。从那里我还希望能够获取该对象并让它吐出 html 标记。 html 标记从技术上来说是 XML,所以我必须认为这是可能的。这是 html 字符串的快速片段——它相当简单。有一个 map 标记,其中包含 0 到多个区域标记作为子标记。

<map id="..." name="...">
<area shape="rect" alt="" title="" coords="68,67,159,159" href="/" target="_self" />
<area shape="circle" alt="" title="" coords="217,43,344,148" href="google.com" target="" />
....
</map>

有人知道有什么 java 库可以简化这个过程吗?我很挣扎。

最佳答案

我会结合 JTidy 来解决这个问题或者 JAXBXStream .

JTidy 将帮助您清理 HTML 标记,这不一定是有效的 XHTML。

然后可以使用 JAXB 或 XStream 将 XHTML 解码为 Java 对象,并将它们以 XML 形式重新编码。

可以这么说,我更熟悉 JAXB,因此我将概述 JAXB 的方式。

使用 JAXB,您可以采用 XHTML 的一些 XML 架构,例如 XHTML 1.0 Strict Schema并使用 JAXB 的模式编译器 XJC 对其进行编译.

由于某些命名冲突,编译很可能从一开始就不会成功。例如,xml:langlang 属性将映射到 Java 类中的相同 lang 属性。此时您需要使用 binding file自定义 XML Schema -> Java 派生。

上面提到的架构如下所示:

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    jaxb:extensionBindingPrefixes="xjc">

    <jaxb:bindings schemaLocation="http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd" node="/xs:schema">
        <jaxb:schemaBindings>
            <jaxb:package name="org.hisrc.w3c.xhtml.v_1_0_strict"/>
        </jaxb:schemaBindings>

        <jaxb:bindings node="xs:attributeGroup[@name='i18n']/xs:attribute[@ref='xml:lang']">
            <jaxb:property name="xmlLang"/>
        </jaxb:bindings>
        <jaxb:bindings node="xs:element[@name='bdo']/xs:complexType/xs:complexContent/xs:extension/xs:attribute[@ref='xml:lang']">
            <jaxb:property name="xmlLang"/>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

当您(希望)最终成功时,您将获得一个包含 90 多个 Java 类的包,这些类派生自 XHTML 1.0 Strict XML Schema。您将获得 MapArea 等类,其中包含架构中所有元素和属性的属性。

有了这些类,您现在可以解码您的 XML(最好使用 JTidy 进行预处理)。这看起来像:

JAXBContext context = JAXBContext.newInstance("org.hisrc.w3c.xhtml.v_1_0_strict");
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBElement<Map> mapElement = (JAXBElement<Map>) unmarshaller.unmarshal(source);
Map map = mapElement.getValue();
List<Area> areas = map.getArea();

现在您拥有了 map 区域,并可以在 Java 级别上对它们执行任何您想要的操作。

最后,您可以将您的map编码回某个结果:

Marshaller marshaller = context.createMarshaller();
JAXBElement<Map> mapElement = new JAXBElement<Map>(
    new QName("http://www.w3.org/1999/xhtml", "map"),
    Map.class, map);
marshaller.marshal(mapElement, result);

所以这或多或少是这样的。

(上面的两个代码片段只是草图,未经测试。)

<小时/>

现在是一个小警告。 JAXB 是强结构化模式的一个非常好的工具。 XHTML 属于“半结构化”类别,因为它允许大量混合内容、任意顺序的元素等等。这些东西在 JAXB 模式派生类中有时看起来很难看。例如,您将获得如下属性:

@XmlElementRefs({
    @XmlElementRef(name = "object", namespace = "http://www.w3.org/1999/xhtml", type = org.hisrc.w3c.xhtml.v_1_0_strict.Object.class, required = false),
    @XmlElementRef(name = "label", namespace = "http://www.w3.org/1999/xhtml", type = Label.class, required = false),
    // 28 lines skipped
    @XmlElementRef(name = "strong", namespace = "http://www.w3.org/1999/xhtml", type = Strong.class, required = false),
    @XmlElementRef(name = "abbr", namespace = "http://www.w3.org/1999/xhtml", type = Abbr.class, required = false)
})
@XmlMixed
protected List<java.lang.Object> content;

这不太好。因此 JAXB 对于该任务可能有些次优

<小时/>

最后,一个小广告 block

免责声明:我领导了一个小型开源项目,名为 w3c-schemas 。该项目使用 JAXB 编译一些 W3C 模式(例如 XLinkXML Schema 本身)。该项目的目标是提供从这些架构编译的现成可用的架构派生类 - 或可用于编译的绑定(bind)文件。

因此,在回答您的问题时,我刚刚将 XHTML 1.0 Strict 添加到我的项目中。您可以在此处访问相关模块:

下面是您自己编译 XHTML 1.0 Strict 架构时可以使用的绑定(bind)文件:

这基本上与我作为上面的代码片段发布的绑定(bind)文件相同。

审稿人注意事项:在这个答案中,我确实提到了我自己的项目。但是,如果OP选择使用JAXB,我引用的模块和代码非常符合问题。

关于java - 从 Html 字符串建模一个类,实例化该类并从该字符串填充变量,然后从该类返回 html 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789341/

相关文章:

java - Apache Ignite 中客户端的内存指标

javascript - JQuery动态添加元素时调整大小的问题

java - 解析 XML 仅获取注释和日期值

java - 特定 url 的过滤器映射

java - Jersey 多部分表单数据默认值?

java - 无法解析 java 类的导入

javascript - 隐藏发帖按钮是否是防止用户未经许可发帖的有效方法?

java - 使用xpath查询java读取xml

java - 我不知道如何将用户输入限制为数字和逗号

html - margin-left 和 margin-right 自动,不能居中