使用vtd-xml解析xml文件

2023-12-10

如何在 java 或 C 中使用 vtd-xml 解析如下所示的 xml 文件?

<?xml version="1.0" encoding="utf-8"?>
<StockReport>
  <Article Code="027783012" Height="35" Width="36" Length="136"  TotalPacks="4" AvailablePacks="4" StockReturnPacks="4" BlockedPacks="0" NextExpiryDate="2015-01-17">
      <Machine Number="1" TotalPacks="4" AvailablePacks="4" StockReturnPacks="4" BlockedPacks="0" NextExpiryDate="2015-01-17" />
 </Article>
 <Article Code="025349109" Height="36" Width="37" Length="129" TotalPacks="6" AvailablePacks="6" StockReturnPacks="6" BlockedPacks="0" NextExpiryDate="2015-01-17">
      <Machine Number="1" TotalPacks="6" AvailablePacks="6" StockReturnPacks="6" BlockedPacks="0" NextExpiryDate="2015-01-17" />
 </Article>
 <Article Code="039154327" Height="0" Width="0" Length="0" TotalPacks="0" AvailablePacks="0" StockReturnPacks="0" BlockedPacks="0" NextExpiryDate="" />
 <Article Code="932654167" Height="57" Width="99" Length="137" TotalPacks="27" AvailablePacks="27" StockReturnPacks="27" BlockedPacks="0" NextExpiryDate="2014-04-17">
    <Machine Number="1" TotalPacks="16" AvailablePacks="16" StockReturnPacks="16" BlockedPacks="0" NextExpiryDate="2015-01-17" />
    <Machine Number="2" TotalPacks="11" AvailablePacks="11" StockReturnPacks="11" BlockedPacks="0" NextExpiryDate="2014-04-17" />
 </Article>
</StockReport>

任何帮助,将不胜感激。

Thanks


我想其中一些取决于您想要如何解析文件。

这是一个“非生产”示例,其中使用了一些有用的技术,包括:

  • XPath 选择(此处仅使用“/*”)
  • 查看所有兄弟节点
  • 通过子节点往下看
  • 使用 AutoPilot 将节点属性提取到地图中

希望能帮助到你

package scce;

import com.ximpleware.AutoPilot;
import com.ximpleware.NavException;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;
import com.ximpleware.XPathEvalException;
import com.ximpleware.XPathParseException;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 *
 * @author David
 */
public class VTDParserExample {

    VTDGen vg;
    VTDNav vn;

    public VTDParserExample() {
        vg = new VTDGen();    
    }

    public void parseAndPrint() throws NavException {

        int level = 0;

        for(boolean el = (vn != null); 
                    el == true ;
                    el = vn.toElement(VTDNav.NEXT_SIBLING)) {

            printTag(vn, level);

            parseAndPrintChildren(level);                
        }

    } 

     private void parseAndPrintChildren(int level) throws NavException {

        vn.push();

        for(boolean el = vn.toElement(VTDNav.FIRST_CHILD); 
                    el == true ;
                    el = vn.toElement(VTDNav.NEXT_SIBLING)) {

            printTag(vn, level + 1);

            parseAndPrintChildren(level + 1);                
        }

        vn.pop();

    }

    public VTDNav loadFile(String filePath) throws IOException {

        File fDoc = new File(filePath);

        if (fDoc != null && fDoc.exists()) {
            System.out.println("loadFile file exists ["+filePath+"]");

            vg.clear();
            if (vg.parseFile(filePath, true)) {
                vn = vg.getNav();
            }
        }
        else {
            throw new IOException("File ["+filePath+"] invalid");
        }             

        if (vn == null) {                
            throw new IOException("Cannot parse file ["+filePath+"]");
        }

        return vn;
    }

    public void getElementsByXpath() {

        AutoPilot ap = new AutoPilot(vn);

        try
        {
            String xpQ = "/*";

            ap.selectXPath(xpQ);    
            if (ap.evalXPathToBoolean()) {
                ap.evalXPath();
            }
            else {
                System.out.println(this.getClass()+".getAllElements evalXPathToBoolean["+ap.evalXPathToBoolean()+"]");
            }
        }
        catch(XPathParseException | XPathEvalException | NavException e) {
            e.printStackTrace();
        }            

    }

    private void loadAttributeMap(VTDNav nav, Map<String, String>amap) {      

        nav.push();

        try {
            AutoPilot apAtt = new AutoPilot(nav);
            apAtt.selectXPath("@*");

            int j=-1;
            while ((j=apAtt.evalXPath())!=-1) {
                String name = nav.toString(j);
                String val = nav.toString(j+1);

                amap.put(name, val);
            }                     
        }
        catch(XPathParseException | XPathEvalException | NavException e) {
            e.printStackTrace();
        }

        nav.pop();        
    }     

    private void printTag(VTDNav vn, int level) throws NavException {

        String tag = vn.toString(vn.getCurrentIndex());
        System.out.print("Level ["+level+"] Tag ["+tag+"]");

        Map<String, String>amap = new LinkedHashMap<String, String>();

        loadAttributeMap(vn, amap);

        for (String aname: amap.keySet()) {
            String aval = amap.get(aname);

            System.out.print(" @"+aname+"="+aval);
        }
        System.out.print("\n");
    }

    public static void main(String[] args) {

        VTDParserExample vp = new VTDParserExample();

        try {

            vp.loadFile("src/scce/famedoro.xml");                                     
            vp.getElementsByXpath();
            vp.parseAndPrint();

        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

产生以下输出:

loadFile file exists [src/scce/famedoro.xml]
Level [0] Tag [StockReport]
Level [1] Tag [Article] @Code=027783012 @Height=35 @Width=36 @Length=136 @TotalPacks=4 @AvailablePacks=4 @StockReturnPacks=4 @BlockedPacks=0 @NextExpiryDate=2015-01-17
Level [2] Tag [Machine] @Number=1 @TotalPacks=4 @AvailablePacks=4 @StockReturnPacks=4 @BlockedPacks=0 @NextExpiryDate=2015-01-17
Level [1] Tag [Article] @Code=025349109 @Height=36 @Width=37 @Length=129 @TotalPacks=6 @AvailablePacks=6 @StockReturnPacks=6 @BlockedPacks=0 @NextExpiryDate=2015-01-17
Level [2] Tag [Machine] @Number=1 @TotalPacks=6 @AvailablePacks=6 @StockReturnPacks=6 @BlockedPacks=0 @NextExpiryDate=2015-01-17
Level [1] Tag [Article] @Code=039154327 @Height=0 @Width=0 @Length=0 @TotalPacks=0 @AvailablePacks=0 @StockReturnPacks=0 @BlockedPacks=0 @NextExpiryDate=
Level [1] Tag [Article] @Code=932654167 @Height=57 @Width=99 @Length=137 @TotalPacks=27 @AvailablePacks=27 @StockReturnPacks=27 @BlockedPacks=0 @NextExpiryDate=2014-04-17
Level [2] Tag [Machine] @Number=1 @TotalPacks=16 @AvailablePacks=16 @StockReturnPacks=16 @BlockedPacks=0 @NextExpiryDate=2015-01-17
Level [2] Tag [Machine] @Number=2 @TotalPacks=11 @AvailablePacks=11 @StockReturnPacks=11 @BlockedPacks=0 @NextExpiryDate=2014-04-17

添加带有 AutoPilot 循环的示例(而不是像上面那样纯粹基于节点)并不能很好地混合这些

package scce;

import com.ximpleware.AutoPilot;
import com.ximpleware.NavException;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;
import com.ximpleware.XPathEvalException;
import com.ximpleware.XPathParseException;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author David
 */
public class VTDParserExample {

    VTDGen vg;
    VTDNav vn;
    AutoPilot ap;

    public VTDParserExample() {
        vg = new VTDGen();    
    }

    public void parseAndPrint() throws NavException {

        int level = 0;

        for(boolean el = (vn != null); 
                    el == true ;
                    el = vn.toElement(VTDNav.NEXT_SIBLING)) {

            printTag(vn, level);

            parseAndPrintChildren(level);                
        }

    } 

     private void parseAndPrintChildren(int level) throws NavException {

        vn.push();

        for(boolean el = vn.toElement(VTDNav.FIRST_CHILD); 
                    el == true ;
                    el = vn.toElement(VTDNav.NEXT_SIBLING)) {

            printTag(vn, level + 1);

            parseAndPrintChildren(level + 1);                
        }

        vn.pop();

    }

    private VTDNav loadFile(String filePath) throws IOException {

        File fDoc = new File(filePath);

        if (fDoc != null && fDoc.exists()) {
            System.out.println("loadFile file exists ["+filePath+"]");

            vg.clear();
            if (vg.parseFile(filePath, true)) {
                vn = vg.getNav();
            }
        }
        else {
            throw new IOException("File ["+filePath+"] invalid");
        }             

        if (vn == null) {                
            throw new IOException("Cannot parse file ["+filePath+"]");
        }

        return vn;
    }

    public boolean getElementsByXpath() {
        boolean found = false;

        ap = new AutoPilot(vn);

        try
        {
            String xpQ = "//Machine";

            ap.selectXPath(xpQ);    
            if (ap.evalXPathToBoolean()) {
                found = true;
            }
            else {
                System.out.println(this.getClass()+".getAllElements evalXPathToBoolean["+ap.evalXPathToBoolean()+"]");
            }
        }
        catch(XPathParseException e) {
            e.printStackTrace();
        }            

        return found;
    }

    private void loadAttributeMap(VTDNav nav, Map<String, String>amap) {      

        nav.push();

        try {
            AutoPilot apAtt = new AutoPilot(nav);
            apAtt.selectXPath("@*");

            int j=-1;
            while ((j=apAtt.evalXPath())!=-1) {
                String name = nav.toString(j);
                String val = nav.toString(j+1);

                amap.put(name, val);
            }                     
        }
        catch(XPathParseException | XPathEvalException | NavException e) {
            e.printStackTrace();
        }

        nav.pop();        
    }     

    private void printTag(VTDNav vn, int level) throws NavException {

        String tag = vn.toString(vn.getCurrentIndex());
        System.out.print("Level ["+level+"] Tag ["+tag+"]");

        Map<String, String>amap = new LinkedHashMap<String, String>();

        loadAttributeMap(vn, amap);

        for (String aname: amap.keySet()) {
            String aval = amap.get(aname);

            System.out.print(" @"+aname+"="+aval);
        }
        System.out.print("\n");
    }

    public static void main(String[] args) {

        VTDParserExample vp = new VTDParserExample();

        try {

            vp.loadFile("src/scce/famedoro.xml");
            if (vp.getElementsByXpath()) {
                 vp.parseAndPrintAP();                
            }
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void parseAndPrintAP() {
        int level = 0;
        int result = -1;

        try {
            while((result = ap.evalXPath())!=-1){
                printTag(vn, level);

                parseAndPrintChildren(level);                

            }
        } catch (XPathEvalException | NavException ex) {
            ex.printStackTrace();
        }
    }

}

将不同的 XPath 设置为“//Machine”会产生:

loadFile file exists [src/scce/famedoro.xml]
Level [0] Tag [Machine] @Number=1 @TotalPacks=4 @AvailablePacks=4 @StockReturnPacks=4 @BlockedPacks=0 @NextExpiryDate=2015-01-17
Level [0] Tag [Machine] @Number=1 @TotalPacks=6 @AvailablePacks=6 @StockReturnPacks=6 @BlockedPacks=0 @NextExpiryDate=2015-01-17
Level [0] Tag [Machine] @Number=1 @TotalPacks=16 @AvailablePacks=16 @StockReturnPacks=16 @BlockedPacks=0 @NextExpiryDate=2015-01-17
Level [0] Tag [Machine] @Number=2 @TotalPacks=11 @AvailablePacks=11 @StockReturnPacks=11 @BlockedPacks=0 @NextExpiryDate=2014-04-17
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用vtd-xml解析xml文件 的相关文章

随机推荐

  • C# 实体框架每个 HttpContext 仅使用一个 ObjectContext

    在 ASP NET MVC 2 中 使用实体框架 4 我收到此错误 实体对象无法被 IEntityChangeTracker 的多个实例引用 对 SO 的搜索表明 这可能是因为我有不同的实体框架 ObjectContext 实例 而每个 H
  • C - 需要比较 int 的“n”最低位是否相等

    C 需要比较nint 的最低位用于相等 IE n 4 xxxx1001 xxxx1001 x 不关心 IE n 2 xxxxxx01 xxxxxx01 想不出不使用掩码的好方法 根据位数创建掩码 int mask 1 lt lt bits
  • Python:Python.h 文件丢失

    我使用的是 Ubuntu 16 04 我正在尝试安装 Murmurhash python 库 但它抛出错误 command x86 64 linux gnu gcc failed with exit status 1 我查了一下网上 说这个
  • 如何在 Windows 8 风格应用程序中将对象从一个 Frame 传递到另一个 Frame

    我有一个问题 我现在无法弄清楚 我正在尝试开发一个 Windows 8 风格的应用程序 但我一直无法实现此功能 我有一个主窗口其中包含一个列表框和一个按钮 可以说添加按钮 当我单击按钮时 我导航到一个新页面 可以说添加客户页面与 this
  • Rails 5 - JS 无法在生产环境中工作(仅限)

    我正在挣扎 我有 Rails 5 应用程序 在我的 app assets javascripts 文件夹中包含一系列 js 文件 这些文件中的js在开发环境中工作得很好 但是当我在heroku上发布时 它停止工作 我可以从 chrome 检
  • 如何在常规 PHP 脚本中继续 CakePHP 3 会话?

    我的情况如下 我有一个 cakephp 项目和一个在同一服务器上运行的单独的纯 php 脚本 当我使用客户端浏览器连接到 cakephp 项目时 它会按预期建立一个会话 现在我想用我的纯 PHP 脚本继续会话数据 我再次使用相同的客户端浏览
  • CSS规则选择不包含元素的元素

    我有一堆看起来像的元素 div div class head div div class footer div div 除了其中一些没有页脚元素 只有一个头部 我想给没有页脚的元素一个底部边框 我希望有类似的事情 hi hasno foot
  • 从地理编码对象获取纬度

    我想从地理编码器返回的结果对象中获取纬度和经度
  • 如何检测用户是否单击了“不允许访问摄像头”

    我正在使用一个UIImagePicker向用户展示相机来拍摄将在应用程序中使用的照片 我的问题是 用户第一次打开图像选择器时 会出现一条提示 我的应用程序想要访问您的相机 有两个选项 不允许和确定 我的要求是 当用户单击 不允许 时 图像选
  • 我可以将 Excel 组合框设置为默认值吗?

    我的组合框 名为ddDatabase 可以具有两个值之一 这两个值是从单独工作表中的表中提取的 但是 当我打开 Excel 文件时 这两个值都没有被选择 相反 组合框显示为空 有什么方法可以明确地将特定值设置为默认值吗 经过一些进一步的测试
  • 通过带分隔符的字符串访问多维数组

    假设我有一个像这样的多维数组 我想通过传递像这样的字符串来访问数组元素 test1 test2 test3 到一个函数 该函数依次调用数组元素 我可以用eval 将字符串替换为 调用 array test2 test3 但我想知道是否有一种
  • 数据库设计 - 为用户存储积分的方法

    只是寻找一些有关如何为此进行数据库设计的建议 在我的网站上 用户可以通过执行不同的活动获得积分 目前 我有 3 项奖励积分的活动 但设计必须具有可扩展性 我也可以添加其他奖励积分的活动 所以今天 用户获得积分 1 当他添加一个新商店时 他获
  • 如何使用泛型 Go 实例化类型参数的非零指针?

    现在类型参数可用golang go master 我决定尝试一下 看来我遇到了在中找不到的限制类型 参数 提案 或者我一定错过了 我想编写一个函数 它返回带有接口类型约束的泛型类型值的切片 如果传递的类型是带有指针接收器的实现 我们如何实例
  • 如何取消从 Git Bash 克隆 Git 存储库?

    我目前正在使用 Git Bash 克隆一个拥有超过 100 000 次提交的大型存储库 克隆过程已经持续了半个多小时 还没有完成对象的接收 是否可以取消git clone来自 Git Bash 的命令 作为参考 我在 Windows 7 P
  • 在渲染 JS canvas 之前加载图像

    我正在编写一个简单的游戏来学习 JS 并且在此过程中我正在学习 HTML5 所以我需要在画布上绘制东西 这是代码 let paddle new Paddle GAME WIDTH GAME HEIGHT new InputHandler p
  • 应用程序窗口预计在应用程序启动结束时有一个根视图控制器

    当我的应用程序启动时出现上述错误 以下代码来自我的 AppDelegate h 文件 import
  • 如何导入数据文件进行UFT API测试?

    我正在开发一个项目 需要在运行时动态导入测试数据并运行与测试数据对应的API测试 我尝试使用 XMLload 直接从 xml 请求加载 这似乎运作良好 但就像 GUI 测试一样 我们导入测试数据 我希望 API 测试也一样 我可以动态地从外
  • SVG - 从中​​心重复缩放路径(脉动)

    我有一个中心点为 100 100 的 svg 图形
  • 从类或实例设置属性时的查找过程是什么?

    Python 简而言之描述了从类获取属性时的查找过程 例如cls name以及从实例获取属性时的查找过程 例如obj name 但我不确定何时设置属性 设置属性 请注意 属性查找步骤仅按照刚刚描述的方式发生 当您引用属性时 而不是当您绑定属
  • 使用vtd-xml解析xml文件

    如何在 java 或 C 中使用 vtd xml 解析如下所示的 xml 文件