【问题标题】:How to convert an XML fragment to string in Java如何在 Java 中将 XML 片段转换为字符串
【发布时间】:2013-07-06 05:36:36
【问题描述】:

输入 XML

<Employees>
    <Employee>
        <EmpId>101398</EmpId>
        <Name>ABC</Name>
    </Employee>
    <Employee>
        <EmpId>101399</EmpId>
        <Name>XYZ</Name>
    </Employee>
<Employees>


Output XML
String : "<Employee><EmpId>101398</EmpId><Name>ABC</Name></Employee>"

注意:我不想使用 XSLT。非常感谢您的回答。

【问题讨论】:

  • 员工101399去哪儿了?您要删除该部分吗?标准是什么?
  • 是的,我希望每个员工的详细信息使用不同的字符串。示例 String0 包含第一个 emp 详细信息,String1 包含第二个 emp 详细信息。感谢您的帮助。

标签: java xml xml-parsing xmlconvert


【解决方案1】:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringWriter;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;



public class XMLFormatter {
    public static void main(String[] args) throws Exception{
        File fXmlFile = new File("src/a.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

        doc.getDocumentElement().normalize();

        System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

        NodeList nList = doc.getElementsByTagName("Employee");

        System.out.println("----------------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

            System.out.println(nodeToString(nList.item(temp)));

        }
    }

    private static String nodeToString(Node node) {
        StringWriter sw = new StringWriter();
        try {
          Transformer t = TransformerFactory.newInstance().newTransformer();
          t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
          t.setOutputProperty(OutputKeys.INDENT, "yes");
          t.transform(new DOMSource(node), new StreamResult(sw));
        } catch (TransformerException te) {
          System.out.println("nodeToString Transformer Exception");
        }
        return sw.toString();
      }


}

问题 a.xml 的运行代码包含您的 xml 细节

【讨论】:

  • 虽然这可能是正确的(我还没有检查过),但如果您解释解决方案背后的概念,它可能会使 OP 和未来的读者受益更多。
  • 在我的例子中,有 3 个组件,中间一个从第一个获取 xml,我们处理该 XML 并将每个员工的详细信息放在一个 Map 中(员工如上面的 XML 示例),然后我们有 2 个使用模板可能是 2 b XSLT 或 apache 速度将其转换为第三个组件接受的 JSON。我们将每个地图发送到模板。模板的主要目的是使其在未来可配置,即即使我们更改 XML,JAVA 级别的逻辑也不应该有任何更改,只有更改应该在模板中。希望你能理解我的要求。
  • 在上面的例子中,如果我们可以在不硬编码“员工”标签的情况下破坏 XML,那就太好了。如果有什么方法可以在不硬编码的情况下做到这一点,请建议我。并感谢您提供的解决方案:)
  • 只需获取您的模板 1.读取节点名称(在这种情况下节点将来自“Employee”) 2.传递节点名称..因此它将取决于模板 ant 它不会被硬编码
猜你喜欢
  • 2010-10-18
  • 2012-07-13
  • 2021-09-23
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
相关资源
最近更新 更多