1

我正在使用 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"?>

我该怎么做?

4

2 回答 2

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")
}
于 2015-06-12T10:49:01.337 回答
0

如果只需要token“1.0”,获取token_DEC_ATTR_NAME对应“version”的token index下一个(index+1)就是那个。只需使用正确的标记类型遍历标记并使用 Vtdnav 类的内置方法测试索引值。

于 2015-06-13T04:03:59.200 回答