2016-05-27 12 views
10

Il mio progetto disporre di file XML nel grezzo risorsa directory del mio progetto Android:Come rimuovere i commenti nei file XML grezzo con Gradle quando il file viene confezionato

Project Layout

vorrei rimuovere i commenti (<!-- ... -->) da questi file quando viene confezionato in .apk di file:

campione del file originale:

<?xml version="1.0" encoding="utf-8"?> 
    <celebrations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:noNamespaceSchemaLocation="celebrations_schema.xsd"> 

    <!-- This is a very important comment useful during development --> 
    <celebration name="celebration 1" type="oneTime" ... /> 

    <!-- This is another very important comment useful during development --> 
    <celebration name="celebration 2" type="reccurent" ... /> 
</celebrations> 

atteso di file filtrati:

<?xml version="1.0" encoding="utf-8"?> 
<celebrations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:noNamespaceSchemaLocation="celebrations_schema.xsd"> 
    <celebration name="celebration 1" type="oneTime" ... /> 
    <celebration name="celebration 2" type="reccurent" ... /> 
</celebrations> 

ho trovato alcune soluzioni interessanti simili here, ma non in grado di gestire a farlo funzionare. L'aggiunta di queste righe nella mia app build.gradle

processResources { 
    filesMatching('**/myxmlfiletobestrippedfromcomments.xml') { 
     filter { 
      String line -> line.replaceAll('<!--.*-->', '') 
     } 
    } 
} 

genera il seguente errore:

Error:(86, 0) Gradle DSL method not found: 'processResources()' 

Per l'apertura e l'analisi del file XML da codice Java, io uso il seguente metodo:

InputStream definition = context.getResources().openRawResource(resId); 
... 
try { 
    XmlPullParser parser = Xml.newPullParser(); 
    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
    parser.setInput(definition, null); 
    parser.nextTag(); 
    return parseCelebrations(parser); 
} finally { 
    definition.close(); 
}  
+0

Sembra che si sta tentando di fare un compito Gradle. Non so come aggiungerlo al processo di compilazione, però. https://docs.gradle.org/current/userguide/tutorial_using_tasks.html –

risposta

6

Il commento predefinito di xml non include alcun pacchetto in apk, è possibile decompilarlo per testarlo.

+0

Tranne se sono memorizzati nella cartella 'raw'. All'inizio ho inserito questo file nella directory 'res \ xml', ma ho riscontrato problemi con l'uso di un file XSD accanto a quello xml. Ho provato di nuovo, e ora tutto è ok: i file xml sono illeggibili in apk e la mia convalida dello schema funziona (non so cosa ho sbagliato all'inizio). Tuttavia, ho dovuto modificare un po 'l'apertura del mio file xml nel codice. – DenisGL

1

ho risolto il mio problema spostando il mio file nella directory res\xml. In questo caso, il file XML è "compilato" ed è illeggibile se apro l'archivio APK.

Tuttavia, ho dovuto cambiare l'apertura e la codice di analisi del mio file XML, a qualcosa di simile:

XmlResourceParser xmlResourceParser = context.getResources().getXml(resId); 
... 
// I had to add this line (to skip START_DOCUMENT tag, which was not needed 
// with opening from the `raw` directory) 
while (xmlResourceParser.next() != XmlPullParser.START_TAG); 

return parseCelebrations(xmlResourceParser); 
+0

Tuttavia, non so perché, e questo è un altro problema/domanda, quando spostato nella cartella XML, il mio file xml non può più essere validato contro il suo schema XML con Android Studio. – DenisGL