我有一个带有HTML数据的XML,并尝试删除'Body'标签内的自由文本,而不删除子'DIV'标签内的内容。到目前为止,我已经使用了removeChild(),它也删除了BODY内部的所有其他内容。然后尝试获取NODE_TYPE == 3以仅过滤和删除文本内容,但是运行它时却得到NODE_TYPE == 1。
使用setTextContent()时,它将整个标签数据设置为我的输入字符串。
这是我的XML外观:
<?xml version="1.0" encoding="UTF-8"?>
<HTML>
<HEAD>
<META content="text/html; charset=utf-8" http-equiv="Content-Type"/>
</HEAD>
<BODY>
<DIV class="WordSection1">
<P>Enter Text here</P> <P>COMPLETED</P>
</DIV>
TEXT I WANT TO REMOVE
</BODY>
</HTML>
更改后,我需要这样的输出:
<?xml version="1.0" encoding="UTF-8"?>
<HTML>
<HEAD>
<META content="text/html; charset=utf-8" http-equiv="Content-Type"/>
</HEAD>
<BODY>
<DIV class="WordSection1">
<P>Enter Text here</P> <P>COMPLETED</P>
</DIV>
</BODY>
</HTML>
有什么建议吗?
我了解您使用的是Java随附的org.w3c.dom旧库。假设您将文档内容读入文档doc
,则可以执行以下操作:
Node textNode = doc.getDocumentElement().getLastChild().getPreviousSibling().getLastChild();
doc.getDocumentElement().getLastChild().getPreviousSibling().removeChild(textNode);
...尽管就输入XML的更改而言,这不是很可靠。
您可能要尝试使用其他XML API(例如JDom)。旧的常常使您的生活变得不那么轻松。
这是jar和documentation页面。
import Torello.HTML.*;
import Torello.HTML.NodeSearch.*;
import Torello.Java.FileRW;
import java.util.*;
import java.net.URL;
import java.io.IOException;
public class SO
{
public static void main(String[] argv) throws IOException
{
String s = FileRW.loadFileToString("SO-Input.html");
Vector page = HTMLPage.getPageTokens(s, false);
// CN_CI "Contains Case Insensitive"
TextNodeRemove.all(page, TextComparitor.CN_CI, "TEXT I WANT TO REMOVE");
FileRW.writeFile(Util.pageToString(page), "SO-Output.html");
}
}
这将产生下面的文件。请注意,如果要在文本周围保留空白,这很容易,但是我需要发布其他答案。此版本将删除包含您的字符串的整个textnode。
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head>
<META content="text/html; charset=utf-8" http-equiv="Content-Type"/>
</head>
<body>
<DIV class="WordSection1">
<p>Enter Text here</p> <p>COMPLETED</p>
</div></body>
</html>