【问题标题】:Java + XML QuestionJava + XML 问题
【发布时间】:2009-09-29 18:59:24
【问题描述】:

我对 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,...),每一个都是不同的变量。

谢谢。

【问题讨论】:

    标签: java xml parsing


    【解决方案1】:

    你可以使用 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_1 号码=9866627 字段=FIELD_2 数量=78050830431 字段=FIELD_3 数字=戈麦斯帕迪拉 字段=FIELD_4 数字=乔瑟基科

    【讨论】:

      【解决方案2】:

      如果您的需求仅限于从 XML 文档中提取值,仅此而已,那么 XPath 查询就足够了。

      Sun JRE 带有一个内置的 XML 解析器、XSLT 转换器和 XPath 引擎。在其他 JRE 上,您需要打包 Xalan 等 XPath 引擎。

      一个很好的教程,让你在 XPath in Java 5 is available at IBM Developerworks 上启动。

      Java API 文档中最重要的类应该是

      • DocumentBuilderFactory
      • 文档生成器
      • 文档
      • XPathFactory
      • XPath
      • XPathExpression
      • XPath 常量

      前三个类将帮助您将 XML 文档的内容加载到一个对象中,您以后可以在 XPath 查询中使用该对象。从创建 XPath 表达式和将表达式的结果转换回应用程序中合适的对象的角度来看,后四个类很重要。

      【讨论】:

      • 也谢谢你!我会检查你提供给我的链接。我认为有必要添加到 lib Xerces 或更多内容。
      • Xerces 和 Xalan 已在 Sun Java 5 JRE 及更高版本中可用。您可以在 JAXP 兼容性说明java.sun.com/j2se/1.5.0/docs/guide/xml/jaxp/… 中找到更多详细信息,其中提到了实际的包。但是,不要依赖实现版本,即内部包,而是使用 DocumentBuilder、XPathFactory 类等来避免问题。
      【解决方案3】:

      如果这是整个 XML 文档,您不妨使用正则表达式来提取“>”和“”之间的字符。这将为您节省大量构建 DOM 文档(例如,通过使用 JDOM)或处理来自 SAX 解析器的回调的开销。

      【讨论】:

      • 在解析 xml 时不使用正确的 xml 解析器感觉像是一条危险的路径。除此之外,正则表达式也会捕获 FIELD_5。
      【解决方案4】:

      同样的代码用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 2015-06-11
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多