在Java中使用VTD-XML获取XML版本节点

时间:2015-06-12 10:31:40

标签: java xml-parsing vtd-xml

我正在使用VTD-XML库解析XML文档,需要从文档中获取版本标记。

我的文档看起来像这样;

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<rootNode>
     <items>
        <item>
            <name>XXX</name>
            <lastName>YYY</lastName>
            <number>1234</number>
        </item>
        <item>
            <name>AAA</name>
            <lastName>BBB</lastName>
            <number>5678</number>
        </item>
        <item>
            <name>CCC</name>
            <lastName>DDD</lastName>
            <number>9012</number>
        </item>
     </items>
</rootNode>

我需要得到这一行。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我不知道如何在VTD-XML中执行此操作。但是下面的答案解释了如何在DOM中完成它。 (对于其他读者:如果DOM不是选项,请忽略此答案)

请注意,version节点的xml属性是指应用的XML标准的版本。为了避免混淆,它不作为文档内容的修订号。

话虽如此,您可以使用Document#getXmlVersion方法 同样,还有getXmlEncoding()getXmlStandalone()

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
Document document = documentBuilder.parse(new File("myFile.xml"));

String version = document.getXmlVersion();
String encoding = document.getXmlEncoding();
boolean standalone = document.getXmlStandalone();

您可以像这样打印:

System.out.println("<?xml version=\"" + version + "\" encoding=\"" + encoding + "\" standalone=\"" + (standalone? "yes" : "no") + "\" ?>");

修改

回答问题:“如何检测是否指定了版本”。

version属性存储在DocumentImpl内的私有字段中,并且在未指定版本时内部为null。在org.apache.xerces.dom实现中,getter提供了默认值:

public String getXmlVersion() {
    return (version == null)?"1.0":version;
}

不幸的是,没有getter可以获得version字段的可空形式。但是你可以使用反射

来访问它
Field versionField = document.getClass().getDeclaredField("version");
versionField.setAccessible(true);
String version = versionField.get(document);
if (version == null) 
{ 
  System.out.println("version was not specified")
}

答案 1 :(得分:0)

如果您只需要令牌&#34; 1.0&#34;,请获取对应于&#34;版本&#34;的TOKEN_DEC_ATTR_NAME令牌索引。下一个(索引+ 1)是一个。只需使用正确的令牌类型迭代令牌,并使用Vtdnav类的内置方法测试索引值。