打包文件时如何用Gradle删除原始XML文件中的注释

我的项目在我的Android项目的原始资源目录中有XML文件:

项目布局

我想从这些文件中删除注释( <!-- ... --> ),当它打包在.apk文件中时:

原始文件样本:

 <?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> 

预期的过滤文件:

 <?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> 

我在这里find了一些有趣的类似解决scheme,但我无法pipe理它的工作。 在我的应用程序build.gradle添加这些行

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

生成以下错误:

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

为了从java代码中打开和parsingXML文件,我使用下面的方法:

 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(); } 

默认的xml的注释将不会打包到apk中,您可以反编译来testing它。

我通过将我的文件移动到res\xml目录来解决我的问题。 在这种情况下,如果我打开APK归档文件,那么XML文件就是“编译的”并且是不可读的。

但是,我不得不改变我的XML文件的开放和parsing代码,如下所示:

 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);