Java中的XHTML操作库

时间:2011-08-13 12:24:14

标签: java html dom

我正在寻找可以为我执行以下两项任务的XML / XHTML Java库/框架。

在进行一些定义之前:

  • NodeOffset(Node node, int offset)标记了XML树中文本节点的某些点。
  • nodeBnodeInodeP是下面提到的XHTML树的相应Node个实例,nodeSpan是一些新创建的节点(其中Node 1}}不一定是org.w3c.dom.Node,可能是任何其他抽象)

将XHTML简化为纯文本

库应该能够从给定的XHTML生成明文输出(例如,通过实现CharSequence或类似)并在输出中的字符和原始XHTML节点树之间提供一对一映射(例如,通过函数NodeOffset getNodeOffset(int plainTextOffset))。

示例:假设我们有以下XHTML:

<p><b>GeForce</b> 9300M GS provides powerful <i>visual computing features</i> to thin and light notebooks.</p>

然后明文表示显然是:

GeForce 9300M GS provides powerful visual computing features to thin and light notebooks.

然后,例如

  • getNodeOffset(0)应返回节点NodeOffset(nodeB, 0)
  • getNodeOffset(40)应返回节点NodeOffset(nodeI, 5)
  • getNodeOffset(80)应返回节点NodeOffset(nodeP, 49)

我可能会错过正确的数字,但我希望,你明白了。我重复这个例子,现在插入了伪标记:

|GeForce 9300M GS provides powerful visua|l computing features to thin and light n|otebooks.

<p><b>|GeForce</b> 9300M GS provides powerful <i>visua|l computing features</i> to thin and light n|otebooks.</p>

节点操作

库应该提供将节点注入XHTML的可能性,XHTML可能跨越可能跨越节点边界的树,例如通过操作NodeSet insert(Node nodeToInsert, NodeOffset start, NodeOffset end, int mode)。该功能有两种模式:

  • mode1 :如有必要,拆分要插入的节点。在这种情况下,从nodeToInsert节点拆分将作为操作结果返回。
  • mode2 :关闭父节点。 nodeToInsert按原样返回。

例如:insert(nodeSpan, NodeOffset(nodeB, 2), NodeOffset(nodeP, 9), mode1)操作应生成

<p><b>Ge<span>Force</span></b><span> 9300M GS</span> provides powerful <i>visual computing features</i> to thin and light notebooks.</p>

insert(nodeSpan, NodeOffset(nodeB, 2), NodeOffset(nodeP, 9), mode2)操作应该产生:

<p><b>Ge</b><span><b>Force</b> 9300M GS</span> provides powerful <i>visual computing features</i> to thin and light notebooks.</p>

它类似于用户在富编辑器中所做的事情:

Ge 强制 9300M GS

我想知道,如果在OpenSource世界中有这样的东西,我真的不想重新实现轮子......我已经快速检查了Open Source HTML Parsers in Java但没有成功。

当你发表答案时:

  • 确保库API中提供上述功能(提供指向JavaDoc的链接)。
  • 该库是Java本机(无JNI)和OpenSource。

3 个答案:

答案 0 :(得分:2)

也许你可以试试jsoup - http://jsoup.org.

它是一个在MIT许可下分发的开源Java库。它的源代码可以在GitHub上找到。

从主页:

  

jsoup是一个用于处理真实HTML的Java库。   它提供了一个非常方便的API,用于提取和操作数据,使用最好的DOM,CSS和类似jquery的方法。

使用jsoup,你可以:

  
      
  • 使用DOM遍历或CSS选择器查找和提取数据
  •   
  • 操纵HTML元素,属性和文本
  •   

这是它的Javadoc:http://jsoup.org/apidocs/

答案 1 :(得分:2)

我包含了我已经拥有的代码,并在开源项目中对您的请求(WIP)进行了修改:ShtutXML。它有很多记录,所以我怀疑你使用它会有问题。

第一个请求(从全局位置查找节点和偏移量)已经内置,并且已经内置了XML中文本节点的拆分(因此您可以根据需要轻松地将它们包装在新节点中)。因此,添加用元素标记区域的逻辑是相当简单的。我稍后会尝试这样做,但这是我现在对此请求的最大努力。

在您的XML上,使用我的example program这是我的输出:

************* BASE DOCUMENT *****************
DOCUMENT ROOT
|-<p >
| |-<b >
| | |-Text: GeForce
| |-Text:  9300M GS provides powerful 
| |-<i >
| | |-Text: visual computing features
| |-Text:  to thin and light notebooks.

*** Text ***
"GeForce 9300M GS provides powerful visual computing features to thin and light notebooks."

*** Node of each text segment ***
[b: null]: GeForce
[p: null]:  9300M GS provides powerful 
[i: null]: visual computing features
[p: null]:  to thin and light notebooks.


*** Offset testing ***
offset 0 is at [b: null] at 0
offset 40 is at [i: null] at 5
offset 80 is at [p: null] at 48

要求它将元素拆分到全局位置4将产生

*********** Split(4) DOCUMENT *****************
DOCUMENT ROOT
|-<p >
| |-<b >
| | |-Text: GeFo
| | |-Text: rce
| |-Text:  9300M GS provides powerful 
| |-<i >
| | |-Text: visual computing features
| |-Text:  to thin and light notebooks.

*** Node of each text segment ***
[b: null]: GeFo
[b: null]: rce
[p: null]:  9300M GS provides powerful 
[i: null]: visual computing features
[p: null]:  to thin and light notebooks.

当然,这种语法拆分对于与该文档匹配的实际XML代码没有任何意义,但它允许一次将一个文本部分包装到您希望的任何其他节点。

编辑:已支持第一种插入模式

编辑2:已支持第二种插入模式

备注:

  • 您可以进行的任何文件修改都会使所有偏移无效。稍后使用它们将导致整个文档损坏。因此,在每次修改后,您必须执行GetOffset以再次检索偏移量。
  • 我知道有些功能没有记录。基本上,应该在包外部使用的唯一函数是您从StrXML类请求的函数。稍后将添加更多文档,您可以通过电子邮件(请参阅我的个人资料页面)与我联系以获取问题。

答案 2 :(得分:1)

几年前我试过Jericho它使用它的API进行解析看起来很简单。我用它来登录雅虎邮件并从地址簿中获取联系人。我相信它可以做得更多。主页提到了您的要求之一“将XHTML简化为纯文本”作为其功能之一。可能与您的问题相关的一些功能是

  • 从HTML标记中提取所有文本的内置功能
  • 可以访问所有已解析段的源文档中的开始和结束位置,只允许修改文档的选定段,而无需从树中重建整个文档。

    它的免费开源。 (引用网站:因此,您可以在商业应用程序中使用它,但须遵守其中任何一个许可文档中详述的条款。)