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

Javaxml自关闭标签

司马建柏
2023-03-14

我的Java程序看起来像:

public static void main(String[] args) {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db;
    try {
        db = dbf.newDocumentBuilder();
        Document document = db.parse(new ByteArrayInputStream("<test><test1></test1></test>".getBytes("UTF-8")));
        StringWriter stringWriter = new StringWriter();
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.INDENT, "no");
        transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
        transformer.transform(new DOMSource(document), new StreamResult(stringWriter));
        System.out.println(stringWriter.toString());
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    }
}

输出为:<代码>

因为我使用的是JasperReports和html样式,只允许我想要的输出。如何做到这一点?Transformer或DocumentBuilderFactory是否有任何输出属性可以进行想要的输出?

共有2个答案

巢德华
2023-03-14

让Java的Transform编写完整的结束标记的一种方法是对Document进行少量更改。就我而言,我自己构建DOM(而不是从String解析XML)。对于我知道它将构成自结束标记的每个节点,我必须(不幸的是)添加一个带有一些随机内容的文本节点,您知道这些内容肯定不会出现在内容本身中。这就是我对没有添加任何其他子元素(因此将成为自结束标记)的元素所做的:

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element test = doc.createElement("test");
doc.appendChild(root);
Element element = doc.createElement("test1");
element.appendChild("_plchldr_"); // because we know it doesn't have children

对于现有文档,您必须遍历它以查找没有子元素的元素。将这些相同的占位符添加到其中。

稍后,当将此XML流式传输到编写器时,必须从生成的XML中删除这些占位符:

TransformerFactory factory = TransformerFactory.newInstance();
transformer.setOutputProperty("omit-xml-declaration", "yes");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
// and here's the trick:
System.out.println( sw.toString().replaceAll("_plchldr_", "") );

或者,您可以使用一个包装编写器来删除“plchldr_u”流。考虑到我的XML的大小(

另一种选择是,如果不想替换输出中的文本,可以添加注释而不是文本节点:

element.appendChild(doc.createComment(" "));

结果不需要删除这些占位符即可成为有效的XML,但是,您的输出中将会有毫无意义的注释。

我认为这是一个肮脏的解决办法,但至少它是有效的!

卓俊晖
2023-03-14

如果在调用transformer之前添加此行。转换-输出将采用html样式:

transformer.setOutputProperty(OutputKeys.METHOD, "html");
 类似资料:
  • 我有两段XML,其中一部分是:

  • 问题内容: 我有一个(旧的)工具,该工具不了解像这样的自动关闭标签。所以,我们需要序列与这样的开启/关闭的标签我们的XML文件:。 目前我有: 如何使用打开/关闭的标签进行序列化? 解 由wildwilhelm给出,如下: 问题答案: 似乎标签已分配了的属性: 如果将标记的属性设置为空字符串,则应获得所需的内容: 考虑到这一点,您可能可以在编写XML之前遍历DOM树并修复属性。像这样:

  • 我在嵌套的代码周围看到一些奇怪的行为 鉴于: 在Chrome中,这会导致 也就是说,它关闭开始标记并打开结束标记。我(当然)听说过“自动关闭标签”;我从没听说过“自动打开标签”。 IE11采用了一种不同的(可以说是更错误的)方式: 因此,它不会自动关闭打开的标记,但它会自动打开关闭的标记,从而导致不平衡的DOM树。 无论如何,我很好奇解决这个问题的正确途径是什么;我应该打开Chrome和IE错误跟

  • 问题内容: 每当我们从数据库或类似来源获取一些用户输入的内容并进行一些编辑时,我们都可能会检索仅包含开始标记但没有结束标记的部分。 这可能会妨碍网站的当前布局。 有客户端或服务器端的方法可以解决此问题吗? 问题答案: 找到了一个很好的答案: 使用PHP 5并使用DOMDocument对象的loadHTML()方法。此自动解析格式错误的HTML,随后对saveXML()的调用将输出有效的HTML。D

  • 问题内容: 我的网页上有一个关闭链接。我想使用它来关闭当前选项卡。我已经写了 上面的代码在Internet Explorer中似乎运行良好。但它不能在Mozilla Firefox和Google Chrome中使用。请帮助我解决此问题。 问题答案: 您只能关闭自己创建的窗口/选项卡。也就是说,您无法以编程方式关闭用户创建的窗口/选项卡。 例如,如果使用创建一个窗口,则可以使用关闭它。

  • 问题内容: 我想知道为什么HTML 标记没有像其他HTML标记那样获得结束标记,如果我们关闭输入标记会出现什么问题呢? 我尝试使用Google,但发现写这样的输入标签的标准没有用来 关闭它。 当我使用以下命令为按钮创建输入标签时,我个人感觉到了问题 尽管创建了单选按钮,但我将附加到单选按钮 不起作用。它只是显示单选按钮,在这种情况下不显示。虽然我可以看到完整的代码: 有人可以解释吗? PS :我遇