0

我想验证 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。

但我不知道如何进行,或者我是否朝着正确的方向前进。我被指派在没有正则表达式的情况下解决这个问题。

有什么建议吗?我在这里迷路了。谢谢。

4

2 回答 2

1

当您看到“<”时首先断开字符串不是解决方法,因为您识别的块与 XML 的层次结构无关。例如,如果您有输入:

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

那么你的一个块将是“/b>yyy<”,这对进一步分解没有用处。

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

于 2012-10-04T21:10:06.763 回答
0

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

于 2012-10-04T19:04:20.847 回答