我正在寻找可以为我执行以下两项任务的XML / XHTML Java库/框架。
在进行一些定义之前:
NodeOffset(Node node, int offset)
标记了XML树中文本节点的某些点。nodeB
,nodeI
,nodeP
是下面提到的XHTML树的相应Node
个实例,nodeSpan
是一些新创建的节点(其中Node
1}}不一定是org.w3c.dom.Node
,可能是任何其他抽象)库应该能够从给定的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)
。该功能有两种模式:
nodeToInsert
节点拆分将作为操作结果返回。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但没有成功。
当你发表答案时:
答案 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:已支持第二种插入模式
备注:强>
StrXML
类请求的函数。稍后将添加更多文档,您可以通过电子邮件(请参阅我的个人资料页面)与我联系以获取问题。答案 2 :(得分:1)
可以访问所有已解析段的源文档中的开始和结束位置,只允许修改文档的选定段,而无需从树中重建整个文档。
它的免费开源。 (引用网站:因此,您可以在商业应用程序中使用它,但须遵守其中任何一个许可文档中详述的条款。)