【问题标题】:Getting tag as well as the values? XML [duplicate]获取标签和值? XML [重复]
【发布时间】:2017-01-02 05:30:28
【问题描述】:

我将以下 XML 作为字符串传递。

<?xml version="1.0"?>
 <tagMain>
    <tag1>
      <a>
        <a>1</a>
        <b>2</b>
        <c>3</c>
        <d>4</d>
      </a>
      <b>5</b>
      <c>6</c>
      <d>7</d>
      <e>8</e>
      <f>9</f>
    </tag1>

    <tag2>
        <r>
            <r1>10</r1>
            <r2>11</r2>
            <r3>12</r3>
            <r4>13</r4>
        </r>
        <b>14</b>
        <c>15</c>
        <d>16</d>
        <e>17</e>
        <f>18</f>
    </tag2>

    <tag3>
        <a>
            <a>1m</a>
            <b>2m</b>
            <c>3m</c>
            <d>4m</d>
        </a>
        <b>5m</b>
        <c>6m</c>
        <d>7m</d>
        <e>8m</e>
        <f>9m</f>
    </tag3>
</tagMain>

我调用下面的方法来获取每个标签之间的值。

public static void  SplitXml(String xml) throws ParserConfigurationException, SAXException, IOException {

        DocumentBuilder builder = DocumentBuilderFactory
                .newInstance().newDocumentBuilder();
        InputSource src = new InputSource();
        src.setCharacterStream(new StringReader(xml));

        Document docu = builder.parse(src);
        String tag1 = docu.getElementsByTagName("tag1").item(0).getTextContent();
        String tag2 = docu.getElementsByTagName("tag2").item(0).getTextContent();
        String tag3 = docu.getElementsByTagName("tag3").item(0).getTextContent();

}

当我运行上面的代码时:

tag1 = "123456789";
tag2 = "101112131415161718";
tag3 = "1m2m3m4m5m6m7m8m9m";

现在我回到我的问题,有没有一种方法可以获取标签以及每个标签中的值:

tag1 = "<tag1><a>
            <a>1</a>
            <b>2</b>
            <c>3</c>
            <d>4</d>
          </a>
          <b>5</b>
          <c>6</c>
          <d>7</d>
          <e>8</e>
          <f>9</f>
        </tag1>";

【问题讨论】:

    标签: java xml split getelementsbytagname


    【解决方案1】:

    我不确定这个功能是否已经存在,但你可以编写一个简单的辅助方法:

    private static String getWrappedTag(String tag, Document doc) {
      StringBuilder sb = new StringBuilder();
      sb.append("<" + tag + ">");
      sb.append(doc.getElementsByTagName(tag).item(0).getTextContent());
      sb.append("</" + tag + ">");
      return sb.toString();
    }
    

    然后这样称呼它:

    String tag1 = getWrappedTag("tag1", doc);
    

    【讨论】:

    • 感谢您的输入,但我正在尝试获取每个标签,其中包含 tag1、tag2、tag3 的值。这将执行以下操作:123456789
    • 您需要在包装标签中进行一些循环或递归才能使此方法起作用。
    【解决方案2】:

    使用LSSerializer (http://docs.oracle.com/javase/8/docs/api/index.html?org/w3c/dom/ls/LSSerializer.html) 或从TransformerFactory 创建默认Transformer,然后您可以使用它来序列化DOM 节点,将DOMSource 传递给transform 方法( https://docs.oracle.com/javase/7/docs/api/javax/xml/transform/Transformer.html#transform(javax.xml.transform.Source,%20javax.xml.transform.Result) 和一个 StringWriter 来收集结果。

    【讨论】:

      【解决方案3】:

      这是一段非常简单的 XPath 和 VTD-XML 代码

      import com.ximpleware.*;
      import java.io.*;
      public class splitXML {
          public static void main(String[] args) throws VTDException, IOException {
              VTDGen vg = new VTDGen();
              if (!vg.parseFile("d:\\xml\\input.xml", false)){
                  System.out.println("error");
                  return;
              }
              VTDNav vn = vg.getNav();
              AutoPilot ap = new AutoPilot(vn);
              ap.selectXPath("/tagmain/*");
              int i=0,n=0;
              FileOutputStream fos =null;
              while((i=ap.evalXPath())!=-1){
                  fos = new FileOutputStream("d:\\xml\\output"+(++n)+".xml");
                  long l = vn.getElementFragment();
                  fos.write(vn.getXML().getBytes(), (int)l, (int)(l>>32));
                  fos.close();
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        感谢大家的意见。

        因为,每次调用该方法时,XML 都会有相同的标签名称,表示标签 1-4。所以,我采取了这种方法....

            public String split(String xml, String tagName1, String tagName2)
           {
               String splitedXML = xml.substring((xml.indexOf(tagName1)), xml.indexOf(tagName2));
        
               return splitedXML;
           }
        

        现在这就是我调用该方法来拆分 tag1、tag2、tag3 值的方式:

            String tag1 = split(XMLString, "<tag1>", "<tag2>"));
            String tag2 = split(XMLString, "<tag2>", "<tag3>"));
            String tag3 = split(XMLString, "<tag3>", "<tag4>"));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-15
          • 1970-01-01
          相关资源
          最近更新 更多