在Java中实现XML解析器用于教育目的

时间:2012-10-04 18:44:20

标签: java xml parsing

我想验证XML(在String对象中)是否格式正确。像这样:

"<root> Hello StackOverflow! <a> Something here </a> Goodbye StackOverflow </root>"

它也应该验证属性,但我现在有点太过分了。我只是想确保我的逻辑正确。这是我到目前为止所得到的,但我被困住了,我需要一些帮助。

public boolean isWellFormed( String str )
{
    boolean retorno = true;

    if ( str == null )
    {
        throw new NullPointerException();
    }

    else
    {
        this.chopTheElements( str );
        this.chopTags();

    }
    return retorno;
}

private void chopTags()
{
    for ( String element : this.elements )
    {
        this.tags.add( element.substring( 1, element.length()-1 ) );
    }
}

public void chopTheElements( String str )
{
    for ( int i = 0; i < str.length(); i++ )
    {
        if ( str.charAt( i ) == '<' )
        {
            elements.add( getNextToken( str.substring( i ) ) );
        }
    }
}

private String getNextToken( String str )
{
    String retStr = "";

    if ( str.indexOf( ">" ) != -1 )
    {
        retStr = str.substring( 0, str.indexOf( ">" ) + 1 );
    }

    return retStr;
}

到目前为止,我在列表中删除了像“”这样的元素,然后在另一个中删除了标签,如下所示:root,/ root。

但我不知道如何继续,或者我是否朝着正确的方向前进。我没有使用正则表达式来解决这个问题。

有什么建议吗?我迷失在这里。感谢。

2 个答案:

答案 0 :(得分:1)

当你看到“&lt;”时打破字符串开始不是那种方法,因为你识别的块将与XML的层次结构无关。例如,如果您有输入:

<a>xxx<b>...</b>yyy</a>

然后你的一个块将是“/ b&gt; yyy&lt;”进一步分手并不是一件有用的事。

您需要根据语法结构构建代码。如果语法表示元素由一个开始标记组成,然后是一系列(元素或字符),然后是结束标记,那么您需要一个匹配该序列的方法,并调用其他方法来处理其组件。因为语法是递归的,所以你的代码将是递归的,因此这被称为递归下降解析。这是计算机科学课程中经常教授的内容,因此您可以在教科书中找到对该主题的出色报道。

答案 1 :(得分:0)

如果您没有处理大型XML文件,请考虑使用DOM解析器。我建议您为此目的查看DocumentBuilder课程。您实际上需要调用不同的parse()方法(您的源可以是文件或任何其他InputSource