2015-06-10 11 views
13

Próbuję skopiować element w raporcie pokrycia HTML, więc sumy pokrycia pojawiają się u góry raportu, a także u dołu.Jak obejść XmlSlurper Groovy'ego, odmawiając parsowania HTML z powodu ograniczeń DOCTYPE i DTD?

HTML rozpoczyna w ten sposób i uważam, że jest dobrze wykształcona:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 
    <link rel="stylesheet" href=".resources/report.css" type="text/css" /> 
    <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" /> 
    <title>Unified coverage</title> 
    <script type="text/javascript" src=".resources/sort.js"></script> 
    </head> 
    <body onload="initialSort(['breadcrumb', 'coveragetable'])"> 

XmlSlurper Groovy za skarży się następująco:

doc = new XmlSlurper(/* false, false, false */).parse("index.html") 
[Fatal Error] index.html:1:48: DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true. 
DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true. 

Włączanie DOCTYPE:

doc = new XmlSlurper(false, false, true).parse("index.html") 
[Fatal Error] index.html:1:148: External DTD: Failed to read external DTD 'xhtml1-strict.dtd', because 'http' access is not allowed due to restriction set by the accessExternalDTD property. 
External DTD: Failed to read external DTD 'xhtml1-strict.dtd', because 'http' access is not allowed due to restriction set by the accessExternalDTD property. 

doc = new XmlSlurper(false, true, true).parse("index.html") 
[Fatal Error] index.html:1:148: External DTD: Failed to read external DTD 'xhtml1-strict.dtd', because 'http' access is not allowed due to restriction set by the accessExternalDTD property. 
External DTD: Failed to read external DTD 'xhtml1-strict.dtd', because 'http' access is not allowed due to restriction set by the accessExternalDTD property. 


doc = new XmlSlurper(true, true, true).parse("index.html") 
External DTD: Failed to read external DTD 'xhtml1-strict.dtd', because 'http' access is not allowed due to restriction set by the accessExternalDTD property. 

doc = new XmlSlurper(true, false, true).parse("index.html") 
External DTD: Failed to read external DTD 'xhtml1-strict.dtd', because 'http' access is not allowed due to restriction set by the accessExternalDTD property. 

więc myślę, że "Pokrył wszystkie opcje. Musi istnieć sposób, żeby to zadziałało bez uciekania się do wyrażeń regularnych i narażania się na gniew Tony'ego Pony.

Odpowiedz

29

Tsk.

parser=new XmlSlurper() 
parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false) 
parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
parser.parse(it) 
1

Nawet jeśli Twój HTML jest dobrze sformatowany XML, bardziej ogólnym rozwiązaniem do parsowania HTML jest prawdziwy parser HTML. W przeszłości używałam parsera TagSoup i całkiem dobrze radził sobie z HTML w świecie rzeczywistym.

TagSoup udostępnia parser implementujący interfejs javax.xml.parsers.SAXParser i może być dostarczony do konstruktora w postaci XmlSlurper. Przykład:

@Grab('org.ccil.cowan.tagsoup:tagsoup:1.2.1') 

import org.ccil.cowan.tagsoup.Parser 

def doc = new XmlSlurper(new Parser()).parse("index.html")