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

标签 java xml vtd-xml

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

<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;
  }

我得到了一个ModifyExcpetion,因为我调用了两次insertAfterHead。 如何生成所需的 xml 形状?我还不完全明白如何将偏移量放到正确的位置。

最佳答案

我想我可能知道您想要实现什么目标。有几点建议

  • selectXPath(a) 只是将 xpath 编译为内部格式...它不会为您计算为节点集。要对其进行评估,您需要调用 evalXPath()。

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

下面是我对您的代码的修改。

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"));
    }

关于java - 如何使用 VTD-XML 以编程方式创建 xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459519/

相关文章:

javascript - 如何在 XML 元素内的 URL 中转义 '&'

sql - Postgres XML 数据类型

android - 我们如何将 Canvas 上的绘图与 Android 中的预定义图像进行比较?

Java XML 解析 - VTD-XML 数据的字符串版本不正确

java - 通过动态传递日期获取总工作日日期

java - repaint() 不再工作

java - 在 VTD-XML 中与 AutoPilot 一起使用时,XPath 评估失败

java - 在 java 中使用 vtd-xml 抛出 java.lang.UnsupportedClassVersionError

java - 如何更改特定单元格apache poi 3.9的字体颜色

java - "test">> : -c: line 0: unexpected EOF while looking for matching `"'