Java 解析器JSoup将标记更改为小写字母

Java 解析器JSoup将标记更改为小写字母,java,jsoup,Java,Jsoup,我做了一些研究,似乎是标准的Jsoup做出了这个改变。我想知道是否有办法配置它,或者是否有其他解析器可以转换为Jsoup的文档,或者有办法解决这个问题?不幸的是,没有,标记的构造函数将名称更改为小写: private Tag(String tagName) { this.tagName = tagName.toLowerCase(); } 但有两种方法可以改变这种行为: 如果需要干净的解决方案,可以克隆/下载并更改此行 如果想要脏的解决方案,可以使用反射 第2条的示例: Field t

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

不幸的是,没有,
标记的构造函数将名称更改为小写:

private Tag(String tagName) {
    this.tagName = tagName.toLowerCase();
}
但有两种方法可以改变这种行为:

  • 如果需要干净的解决方案,可以克隆/下载并更改此行
  • 如果想要脏的解决方案,可以使用反射
  • 第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
    

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

    我使用的是1.11.1-SNAPSHOT版本,它没有这段代码

    private Tag(String tagName) {
        this.tagName = tagName.toLowerCase();
    }
    
    因此,我按照上面的建议检查了
    ParseSettings
    ,并将这段代码从:

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

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

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


    您必须使用xmlParser而不是htmlParser,并且标记将保持不变。一句话就可以做到:

    String html = "<camelCaseTag>some text</camelCaseTag>";
    Document doc = Jsoup.parse(html, "", Parser.xmlParser());
    
    String html=“一些文本”;
    Document doc=Jsoup.parse(html,“,Parser.xmlParser());
    
    我不得不更改您提到的大部分代码,但使用第一种方法效果很好。谢谢你的提示。1真的是这样的努力吗?我假设只有这一行需要更改,因为我不只是使用解析器,而是使用其他函数来更改。如果需要的话,我可以在某个地方发布取消更改的库…你必须更改的类的名称将非常棒:-)。。。仅出于个人利益。尝试解决方案1。不工作。还有哪些类需要修改?
    Parser parser = Parser.htmlParser();
    parser.settings(new ParseSettings(true, true));
    Document doc = parser.parseInput(html, baseUrl);
    
    String html = "<camelCaseTag>some text</camelCaseTag>";
    Document doc = Jsoup.parse(html, "", Parser.xmlParser());