我想验证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。
但我不知道如何继续,或者我是否朝着正确的方向前进。我没有使用正则表达式来解决这个问题。
有什么建议吗?我迷失在这里。感谢。
答案 0 :(得分:1)
当你看到“&lt;”时打破字符串开始不是那种方法,因为你识别的块将与XML的层次结构无关。例如,如果您有输入:
<a>xxx<b>...</b>yyy</a>
然后你的一个块将是“/ b&gt; yyy&lt;”进一步分手并不是一件有用的事。
您需要根据语法结构构建代码。如果语法表示元素由一个开始标记组成,然后是一系列(元素或字符),然后是结束标记,那么您需要一个匹配该序列的方法,并调用其他方法来处理其组件。因为语法是递归的,所以你的代码将是递归的,因此这被称为递归下降解析。这是计算机科学课程中经常教授的内容,因此您可以在教科书中找到对该主题的出色报道。
答案 1 :(得分:0)
如果您没有处理大型XML文件,请考虑使用DOM解析器。我建议您为此目的查看DocumentBuilder课程。您实际上需要调用不同的parse()
方法(您的源可以是文件或任何其他InputSource )