gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:19:39 25 4
gpt4 key购买 nike

这可能有点难以解释,但我正在尝试从 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/

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