- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能有点难以解释,但我正在尝试从 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 来解决这个问题或者 JAXB或XStream .
JTidy 将帮助您清理 HTML 标记,这不一定是有效的 XHTML。
然后可以使用 JAXB 或 XStream 将 XHTML 解码为 Java 对象,并将它们以 XML 形式重新编码。
可以这么说,我更熟悉 JAXB,因此我将概述 JAXB 的方式。
使用 JAXB,您可以采用 XHTML 的一些 XML 架构,例如 XHTML 1.0 Strict Schema并使用 JAXB 的模式编译器 XJC 对其进行编译.
由于某些命名冲突,编译很可能从一开始就不会成功。例如,xml:lang
和 lang
属性将映射到 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。您将获得 Map
和 Area
等类,其中包含架构中所有元素和属性的属性。
有了这些类,您现在可以解码您的 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 模式(例如 XLink 或 XML Schema 本身)。该项目的目标是提供从这些架构编译的现成可用的架构派生类 - 或可用于编译的绑定(bind)文件。
因此,在回答您的问题时,我刚刚将 XHTML 1.0 Strict 添加到我的项目中。您可以在此处访问相关模块:
下面是您自己编译 XHTML 1.0 Strict 架构时可以使用的绑定(bind)文件:
这基本上与我作为上面的代码片段发布的绑定(bind)文件相同。
审稿人注意事项:在这个答案中,我确实提到了我自己的项目。但是,如果OP选择使用JAXB,我引用的模块和代码非常符合问题。
关于java - 从 Html 字符串建模一个类,实例化该类并从该字符串填充变量,然后从该类返回 html 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789341/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!