10

我做了一些研究,似乎是标准的 Jsoup 做出了这个改变。我想知道是否有办法配置它,或者是否有其他解析器可以转换为 Jsoup 文档,或者有什么方法可以解决这个问题?

4

5 回答 5

10

不幸的是,Tag类的构造函数将名称更改为小写:

private Tag(String tagName) {
    this.tagName = tagName.toLowerCase();
}

但是有两种方法可以改变这种行为:

  1. 如果您想要一个干净的解决方案,您可以克隆/下载JSoup Git并更改此行。
  2. 如果你想要一个肮脏的解决方案,你可以使用反射。

#2 的示例:

Field tagName = Tag.class.getDeclaredField("tagName"); // Get the field which contains the tagname
tagName.setAccessible(true); // Set accessible to allow changes

for( Element element : doc.select("*") ) // Iterate over all tags
{
    Tag tag = element.tag(); // Get the tag of the element
    String value = tagName.get(tag).toString(); // Get the value (= name) of the tag

    if( !value.startsWith("#") ) // You can ignore all tags starting with a '#'
    {
        tagName.set(tag, value.toUpperCase()); // Set the tagname to the uppercase
    }
}

tagName.setAccessible(false); // Revert to false
于 2013-10-29T20:22:29.877 回答
3

这是一个代码示例(版本 >= 1.11.x):

Parser parser = Parser.htmlParser();
parser.settings(new ParseSettings(true, true));
Document doc = parser.parseInput(html, baseUrl);
于 2018-06-06T08:20:00.323 回答
3

1.9.3 版本中引入了 ParseSettings 类。它带有为标签和属性保留大小写的选项。

于 2016-10-11T20:39:55.237 回答
2

您必须使用 xmlParser 而不是 htmlParser 并且标签将保持不变。一行可以解决问题:

String html = "<camelCaseTag>some text</camelCaseTag>";
Document doc = Jsoup.parse(html, "", Parser.xmlParser());
于 2020-04-20T15:56:23.470 回答
0

我正在使用没有这段代码的 1.11.1-SNAPSHOT 版本。

private Tag(String tagName) {
    this.tagName = tagName.toLowerCase();
}

所以我ParseSettings按照上面的建议进行了检查,并将这段代码从:

static {
    htmlDefault = new ParseSettings(false, false);
    preserveCase = new ParseSettings(true, true);
}

至:

static {
    htmlDefault = new ParseSettings(true, true);
    preserveCase = new ParseSettings(true, true);
}

并在构建 JAR 时跳过了测试用例。

于 2017-06-15T05:40:26.543 回答