/** * Parse binary xml. */ public async Task parse() { ChunkHeader chunkHeader = await readChunkHeader(); if (chunkHeader == null) { return; } if (chunkHeader.getChunkType() != ChunkType.XML && chunkHeader.getChunkType() != ChunkType.NULL) { // notice that some apk mark xml header type as 0, really weird // see https://github.com/clearthesky/apk-parser/issues/49#issuecomment-256852727 return; } // read string pool chunk chunkHeader = await readChunkHeader(); if (chunkHeader == null) { return; } ParseUtils.checkChunkType(ChunkType.STRING_POOL, chunkHeader.getChunkType()); stringPool = await ParseUtils.readStringPool(buffer, (StringPoolHeader)chunkHeader); // read on chunk, check if it was an optional XMLResourceMap chunk chunkHeader = await readChunkHeader(); if (chunkHeader == null) { return; } if (chunkHeader.getChunkType() == ChunkType.XML_RESOURCE_MAP) { long[] resourceIds = readXmlResourceMap((XmlResourceMapHeader)chunkHeader); resourceMap = new string[resourceIds.Length]; for (int i = 0; i < resourceIds.Length; i++) { resourceMap[i] = await Attribute_.AttrIds.getString(resourceIds[i]); } chunkHeader = await readChunkHeader(); } while (chunkHeader != null) { /*if (chunkHeader.chunkType == ChunkType.XML_END_NAMESPACE) { * break; * }*/ long beginPos = buffer.position(); switch (chunkHeader.getChunkType()) { case ChunkType.XML_END_NAMESPACE: XmlNamespaceEndTag xmlNamespaceEndTag = readXmlNamespaceEndTag(); xmlStreamer.onNamespaceEnd(xmlNamespaceEndTag); break; case ChunkType.XML_START_NAMESPACE: XmlNamespaceStartTag namespaceStartTag = readXmlNamespaceStartTag(); xmlStreamer.onNamespaceStart(namespaceStartTag); break; case ChunkType.XML_START_ELEMENT: XmlNodeStartTag xmlNodeStartTag = await readXmlNodeStartTag(); break; case ChunkType.XML_END_ELEMENT: XmlNodeEndTag xmlNodeEndTag = readXmlNodeEndTag(); break; case ChunkType.XML_CDATA: XmlCData xmlCData = await readXmlCData(); break; default: if (chunkHeader.getChunkType() >= ChunkType.XML_FIRST_CHUNK && chunkHeader.getChunkType() <= ChunkType.XML_LAST_CHUNK) { Buffers.skip(buffer, chunkHeader.getBodySize()); } else { throw new ParserException("Unexpected chunk type:" + chunkHeader.getChunkType()); } break; } buffer.position((int)(beginPos + chunkHeader.getBodySize())); chunkHeader = await readChunkHeader(); } }
public void onNamespaceEnd(XmlNamespaceEndTag tag) { }