2014-02-25 56 views
0

我有一个包含两种元素类型的XML文档。一种仅具有属性的元素类型,另一种仅包含第一种元素。XML元素类型全都相同

<TagList name="Results"> 
    <Tag name="type_of_identifier" value="idvalue"/> 
    <Tag name="some_other_identifier" value="otheridvalue"/> 
    .... 
    <Tag name="type" value="asdfaf"/> 
    <TagList name="SubList"> 
     <Tag name="param1" value="value1"/> 
     <Tag name="param2" value="value2"/> 
    </TagList> 
</TagList> 

我是新来的XML(也是Java),我只是不知道为什么这样设置这种方式。

有没有办法通过指定名称来获取节点的值,而不必遍历每个节点?

+3

Xpath呢? 看到这个问题http://stackoverflow.com/questions/2811001/how-to-read-xml-using-xpath-in-java –

+0

只要你做,不要尝试和使用正则表达式,或沿着这些东西试图缩小它的范围,而不是循环一切。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags更多信息 – WillBD

+0

@JaroslavKubacek是的,XPath应该这样做。我正在遵循http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/的例子,它使事情变得非常混乱。 – horriblyUnpythonic

回答

1

考虑在处理文件之前将文件转换为更卫生的文件。一个简单的XSLT样式表有两个模板规则:

<xsl:template match="TagList"> 
    <xsl:element name="{@name}"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="Tag"> 
    <xsl:element name="{@name}"> 
    <xsl:value-of select="@value"/> 
    </xsl:element> 
</xsl:template> 

将其转换为这样的事情:

<Results> 
    <type_of_identifier>idvalue</type_of_identfier> 
    <some_other_identifier>otheridvalue<some_other_identifier/> 
    .... 
    <type>asdfaf</type> 
    <SubList> 
     <param1>value1</param1> 
     <param2>value2</param2> 
    </SubList> 
</Results> 

这样做的好处是,该文件的所有后续处理变得更加容易。

+0

这看起来好像会起作用。我真正的XML文件稍微复杂一点,但你的例子应该足以让我开始。 – horriblyUnpythonic

+0

看起来'apply-templates'部分工作不正常。它缩进,但不放标签。 – horriblyUnpythonic

+0

是的,那样做,谢谢!虽然我学会了这个小错别字可能非常令人沮丧的难题。 – horriblyUnpythonic

相关问题