当前位置: 首页 > 知识库问答 >
问题:

如何使用VTD-XML以编程方式创建xml?

姬墨竹
2023-03-14

我想创建一个具有此形状的xml,在其中我将内部元素插入循环中,并在元素上设置属性。

<ROOT>
  <a>
    <b attr1="1" attr2="a"/>
  </a>
  <a>
    <b attr1="1" attr2="b"/>
  </a>
  <a>
    <b attr1="2" attr2="a"/>
  </a>
  <a>
    <b attr1="2" attr2="b"/>
  </a>
</ROOT>

这是我目前掌握的代码:

  public static String createXML(Collection<Integer> numbers, Collection<String> words) {
    String charsetName = "UTF-16";
    byte[] root = "<ROOT></ROOT>".getBytes(charsetName);
    VTDGen vg = new VTDGen();
    AutoPilot ap = new AutoPilot();
    ap.selectXPath("/ROOT");
    XMLModifier xm = new XMLModifier();
    vg.setDoc(root);
    vg.parse(false);
    VTDNav vn = vg.getNav();
    ap.bind(vn);
    xm.bind(vn);

    byte[] aTag = "<a></a>".getBytes(charsetName);
    byte[] bTag = "<b />".getBytes(charsetName);

    int i;

    String collect = numbers.stream().flatMap(number -> words.stream().map(word -> {
      try {
        xm.insertAfterHead(aTag);
        ap.selectXPath("a");
        xm.insertAfterHead(bTag);
        ap.selectXPath("b");
        xm.insertAttribute(String
          .format(" attr1=\"%d\" attr2=\"%s\"",
            number,
            word));
        return xm.outputAndReparse().toNormalizedString(0);
      } catch (ModifyException | NavException | ParseException | IOException | TranscodeException | XPathParseException e) {
        throw new RuntimeException(e);
      }
    }))
      .collect(Collectors.joining(""));

    return collect;
  }

我得到了一个ModifyException,因为我给insertAfterHead打了两次电话。如何生成所需的xml形状?我还不完全理解如何将偏移量放到正确的位置。

共有1个答案

齐威
2023-03-14

我想我可能知道你想要完成什么。有一些建议

>

  • selectXPath(a)只是将xpath编译成内部格式...它不会评估为您设置的节点。要评估它,您需要调用valXPath()。

    您希望在根节点下插入尽可能多的字符串连接。实际的字符串连接操作应该作为应用逻辑的独立部分进行。在VTD-XML中,您可以根据位字节、字节数组和int/long数组来考虑。

    下面是我的代码mod。

    public static void main(String[] args) throws VTDException,IOException,
        UnsupportedEncodingException{
            String charsetName = "UTF-16";
            byte[] root = "<ROOT><a><b/></a><a><b/></a><a><b/></a><a><b/></a></ROOT>"
        .getBytes(charsetName); // that is template you want to start with
            VTDGen vg = new VTDGen();
            AutoPilot ap = new AutoPilot();
            ap.selectXPath("/ROOT/a/b");
            XMLModifier xm = new XMLModifier();
            vg.setDoc(root);
            vg.parse(false);
            VTDNav vn = vg.getNav();
            ap.bind(vn);
            xm.bind(vn);
            int i=0;
            int[] ia = new int[4];
            ia[0]=1;ia[1]=1;ia[2]=2;ia[3]=2;
            String[] sa = new String[4];
            sa[0]="a";sa[1]="b";sa[2]="a";sa[3]="b";
            int k=0;
            while((i=ap.evalXPath())!=-1){
                xm.insertAttribute( String.format(" attr1=\"%d\" attr2=\"%s\"",
                        ia[k],
                        sa[k]));
                k++;
            }
            XMLByteOutputStream xbos = new XMLByteOutputStream(xm.getUpdatedDocumentSize());
            xm.output(xbos);
            System.out.println(new String(xbos.getXML(),"UTF-16"));
        }
    

  •  类似资料:
    • 我对如何做到这一点有点困惑,所有的文档/示例都展示了如何读取和编辑xml文档,但似乎没有任何从头开始创建xml的明确方法,我宁愿不必将我的程序与虚拟xml文件一起发布以编辑一个。有什么想法吗?谢谢。

    • 我正尝试使用以下命令以编程方式创建:

    • 问题内容: 是否有免费的库可根据图像序列创建MPEG(或任何其他简单的视频格式)? 它也必须在Linux上运行,并且最好具有Python绑定。 问题答案: 我知道有一个mencoder(是mplayer项目的一部分)和ffmpeg,它们都可以做到这一点。

    • 我有一个充满自定义视图的应用程序。当我尝试以编程方式创建FAB时,它会抛出一个错误 原因:java.lang.IllegalArgumentException:您需要在设计库中使用theme.AppCompat主题(或后代)。

    • 问题内容: 概要 我正在开发一个Web应用程序以学习Django(python 3.4和Django 1.6.10)。该Web应用程序具有复杂且经常更新的工作流程。我决定集成Django-Viewflow库(https://github.com/viewflow/viewflow/),因为这似乎是处理工作流且不将工作流逻辑与应用程序模型合并的一种非常方便的方法。 在这种情况下,我创建了一个工作流以

    • 问题内容: 我正在尝试以编程方式在Java中创建新的密钥库。如下代码: 引发未初始化的KeyStore异常。 问题答案: 创建密钥库后,需要将其加载。load方法要求读取FileInputStream,但是如果您提供一个null,则将加载一个空的KeyStore。 看到这个链接