我对XML解析很陌生。如果你能帮助我,我将非常感激。
我需要提取一些结构为:
的XML文档中的数据<DWDocument DW5BasketFileName="DOCU0001.001">
<FileInfos>
<ImageInfos>
<ImageInfo id="0,0,0" nPages="0">
<FileInfo fileName="PATH_1" dwFileName="FILE_NAME_1" signedFileName="FILE_NAME_2" type="normal" length="77324" />
</ImageInfo>
</ImageInfos>
</FileInfos>
<FileDatas />
<Section number="0" startPage="0" dwguid="d8a50daf-d4df-4012-ad0c-85e26a6e0755">
<Metadata version="0">
<FieldProperties>
<TextVar length="20" field="FIELD_1" id="0">9866627</TextVar>
<TextVar length="20" field="FIELD_2" id="1">78050830431</TextVar>
<TextVar length="40" field="FIELD_3" id="32">GOMEZ PADILLA</TextVar>
<TextVar length="40" field="FIELD_4" id="33">JOSSER KICO</TextVar>
<Date field="FIELD_5" id="64">1985-07-02T00:00:00</Date>
</FieldProperties>
</Metadata>
</Section>
</DWDocument>
我在Java桌面应用程序中。我不知道该怎么做,如果它可能是一个代码示例。
我需要将FIELD_1提取到FIELD_4值(986627,...),每个值都是一个不同的变量。
感谢。
答案 0 :(得分:4)
你可以使用XPath
String filename = "C:\\a.xml";
String expression = "//TextVar";
try {
Document document = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(new File(filename));
NodeList nn = (NodeList) XPathFactory.newInstance().newXPath()
.evaluate(expression, document, XPathConstants.NODESET);
for (int i = 0; i < nn.getLength(); i++) {
Node item = nn.item(i);
String field = item.getAttributes().getNamedItem("field").getTextContent();
String number = item.getTextContent();
System.out.println("field=" + field);
System.out.println("number=" + number);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
输出:
field=FIELD_1 number=9866627 field=FIELD_2 number=78050830431 field=FIELD_3 number=GOMEZ PADILLA field=FIELD_4 number=JOSSER KICO
答案 1 :(得分:3)
如果您的需求仅限于从XML文档中提取值而不再需要,那么XPath查询就足够了。
Sun JRE附带了一个内置的XML解析器,XSLT转换器和XPath引擎。在其他JRE上,您需要打包像Xalan这样的XPath引擎。
一个很好的教程,可以让你在XPath in Java 5 is available at IBM Developerworks上自行启动。
在Java API文档中开始引用的最重要的类是
前三个类可以帮助您将XML文档的内容加载到对象中,以后可以在XPath查询中使用。从创建XPath表达式和将表达式的结果转换回应用程序中的合适对象的角度来看,后四个类很重要。
答案 2 :(得分:0)
如果这是整个XML文档,您也可以使用正则表达式来提取“&gt;”之间的字符。和“”。这将为您节省构建DOM文档(例如,通过使用JDOM)或处理来自SAX解析器的回调的大量开销。
答案 3 :(得分:0)
用VTD-XML编写的相同代码,以防你被这么多工厂搞糊涂了:
import com.ximpleware.*;
public class Example1 {
public static void main(String[] argv) throws Exception{
VTDGen vg = new VTDGen();
if (vg.parseFile("c:/test2.xml",true)){
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("//TextVar/text()");
int i;
while((i=ap.evalXPath())!=-1){
System.out.println(" text value ==>"+vn.toString(i));
}
}
}
}
输出
text value ==>9866627
text value ==>78050830431
text value ==>GOMEZ PADILLA
text value ==>JOSSER KICO