java - 转换 xml 标签

标签 java xml dom

我需要进行这样的转换:

给定(众多之一):

    <Field name="topmostSubform[0].Page1[0].MemberID[0]" value="025620451" />

我需要将其转换为这样的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<topmostSubform ind="0">
     <page ind ="0">
         <MemeberID ind="0">025620451</MemeberID>
     </page>
</topmostSubform>

我得到了一大堆字段,如示例中所示,我需要将其转换为一个 xml。

字段标记可以包含比示例更多的标记。

您建议采用什么方法?

困难在于使用什么数据结构?我怎样才能填充这个数据库,以便最终我可以从中创建一个 xml?

我尝试在迭代输入时使用 DOM 构建 xml,但在这种情况下我创建了很多重复的标签。

谢谢。

最佳答案

xpath 的组合来检查元素是否已经存在,并且递归将执行您想要的操作。

这是我想到的:

import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class Transformation 
{
  private static final XPath XPATH = XPathFactory.newInstance().newXPath();

  public static void main(String[] args) 
  {
    try 
    {
      DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

      Document xml1 = documentBuilder.parse(new ByteArrayInputStream("<Field name=\"topmostSubform[0].Page[0].MemberID[0]\" value=\"1\"/>".getBytes()));
      Document xml2 = documentBuilder.parse(new ByteArrayInputStream("<Field name=\"topmostSubform[0].Page[0].MemberID[1]\" value=\"2\"/>".getBytes()));
      Document xml3 = documentBuilder.parse(new ByteArrayInputStream("<Field name=\"topmostSubform[0].Page[1].MemberID[0]\" value=\"3\"/>".getBytes()));
      Document xml4 = documentBuilder.parse(new ByteArrayInputStream("<Field name=\"topmostSubform[1].Page[0].MemberID[0]\" value=\"4\"/>".getBytes()));

      Document document = documentBuilder.newDocument();
      document.appendChild(document.createElement("root"));

      //Loop through each piece of XML creating elements in the single document as necessary.
      for (Document xml : new Document[]{xml1, xml2, xml3, xml4}) 
      {
        Element fieldElement = (Element)XPATH.evaluate("/Field", xml, XPathConstants.NODE);

        String name = fieldElement.getAttribute("name");
        String value = fieldElement.getAttribute("value");

        createElements(
          document, 
          document.getDocumentElement(), 
          new ArrayList<String>(Arrays.asList(name.split("\\."))), 
          value
        );
      }

      //Print the result at the command line.
      Transformer transformer = TransformerFactory.newInstance().newTransformer();
      transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

      StringWriter writer = new StringWriter();
      transformer.transform(new DOMSource(document), new StreamResult(writer));

      System.out.println(writer.getBuffer().toString());
    }
    catch (Exception e) 
    {
      e.printStackTrace();
    }
  }

  /**
   * Creates child elements under the <code>parent</code> based on the <code>nameTokens</code>.
   */
  private static void createElements(Document document, Element parent, List<String> nameTokens, String value) throws XPathExpressionException 
  {
    String nameToken = nameTokens.remove(0);

    String name = nameToken.substring(0, nameToken.indexOf("["));
    String index = nameToken.substring(nameToken.indexOf("[") + 1, nameToken.indexOf("]"));

    Element element = (Element)XPATH.evaluate(name + "[@ind=" + index + "]", parent, XPathConstants.NODE);
    if (element == null) 
    {
      element = document.createElement(name);
      element.setAttribute("ind", index);
      parent.appendChild(element);
    }

    if (nameTokens.isEmpty()) 
    {
      element.appendChild(document.createTextNode(value));
    }
    else 
    {
      createElements(document, element, nameTokens, value);
    }
  }
}

(格式化后)打印:

<root>
  <topmostSubform ind="0">
    <Page ind="0">
      <MemberID ind="0">1</MemberID>
      <MemberID ind="1">2</MemberID>
    </Page>
    <Page ind="1">
      <MemberID ind="0">3</MemberID>
    </Page>
  </topmostSubform>
    <topmostSubform ind="1">
      <Page ind="0">
        <MemberID ind="0">4</MemberID>
      </Page>
    </topmostSubform>
 </root>

关于java - 转换 xml 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16280228/

相关文章:

c# - 从 XmlElement 创建 XPathDocument

java - 如何检索节点列表中的属性值

java - 密码验证发出错误的输出?

java - Java 7 SE 是否支持 EJB?

java - 对 Oracle java 存储过程中的类解析的混淆

Java org.w3c.dom : is there a Java parser library?

javascript - 使用按钮从 XML 中检索数据

java - 步骤链接的说明

java - Spring MVC XML View

sql - XML 模式集合破坏了 xquery