XML文件解析数据结构

Posted mmmmar的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML文件解析数据结构相关的知识,希望对你有一定的参考价值。

最近在解析android安装包内经过编译的二进制XML文件时想在内存中建立起其对应的树结构。

想了一早晨,思路如下图。

多叉树中的每个节点除了有子节点和兄弟节点以外还有一个指针指向父节点,然后根据状态转移图执行相应的代码就行。

public void main() {
    XmlTagTree tree = new XmlTagTree();
    while (true) {
        // 获取xml标签
        Tag tag = getTag();
        if (tag.isStartTag()) {
            tree.addNode(tag, XmlTagTree.STATE_START);
        } else if (tag.isEndTag()){
            tree.addNode(null, XmlTagTree.STATE_END);    
        }        
    }
}

class Tag {
    private Tag parent;
    private Tag child;
    private Tag next;
}

class XmlTagTree {

    public final static int STATE_START = 0;
    public final static int STATE_END = 1;

    private int mCurrentState = STATE_START;
    private Tag mRoot;
    private Tag mCurrent;
    private XmlTreeOperate[][] mOperates;
    private int mSize = 0;

    public XmlTagTree() {
        mOperates = new XmlTreeOperate[2][2];
        mOperates[STATE_START][STATE_START] = new XmlTreeOperate() {
            @Override
            public void operate(Tag chunk, int state) {
                if (mRoot == null) {
                    // 第一次操作,初始化节点
                    mRoot = chunk;
                    mCurrent = chunk;
                } else {
                    // (START, START) -> addChild
                    mCurrent.child = chunk;
                    chunk.parent = mCurrent;
                    mCurrent = chunk;
                    ++mSize;
                }
            }
        };
        mOperates[STATE_START][STATE_END] = new XmlTreeOperate() {
            @Override
            public void operate(Tag chunk, int state) {
                // (START, END) -> none
                // do not do anything
            }
        };
        mOperates[STATE_END][STATE_START] = new XmlTreeOperate() {
            @Override
            public void operate(Tag chunk, int state) {
                // (END, START) -> addSibling
                 mCurrent.next = chunk;
                chunk.parent = mCurrent.parent;
                mCurrent = chunk;
                ++mSize;
            }
        };
        mOperates[STATE_END][STATE_END] = new XmlTreeOperate() {
            @Override
            public void operate(Tag chunk, int state) {
                // (END, END) -> goParent
                mCurrent = mCurrent.parent;
            }
        };
    }

    public void addNode(Tag chunk, int state) {
        if (mRoot == null && state != STATE_START) {
            throw new RuntimeException("first state in XmlTagTree must be STATE_START");
        }
        mOperates[mCurrentState][state].operate(chunk, state);
        mCurrentState = state;
    }

    private interface XmlTreeOperate {
        void operate(Tag chunk, int state);
    }
}

 

以上是关于XML文件解析数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Expat Parser解析xml文件

DOM解析xml文件

Android之DOM解析XML

Android之DOM解析XML

从流输入中解析没有根元素的 XML 片段列表

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段