当前位置: 首页 > 面试题库 >

用Java解析时如何在文档元素前保留空格?

申辉
2023-03-14
问题内容

在我的应用程序中,我更改了XMLhtml" target="_blank">文件的某些部分,其开始如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: version control yadda-yadda $ -->

<myElement>
...

注意之前的空白行<myElement>。加载,更改和保存后,结果远非令人满意:

<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: version control yadda-yadda $ --><myElement>
...

我发现注释和文档节点之间的空白(一个换行符)根本没有在DOM中表示。下面的独立代码可靠地重现了此问题:

String source =
    "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<!-- foo -->\n<empty/>";
byte[] sourceBytes = source.getBytes("UTF-16");

DocumentBuilder builder =
    DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc =
    builder.parse(new ByteInputStream(sourceBytes, sourceBytes.length));

DOMImplementationLS domImplementation =
    (DOMImplementationLS) doc.getImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
System.out.println(lsSerializer.writeToString(doc));

// output: <?xml version="1.0" encoding="UTF-16"?>\n<!-- foo --><empty/>

有谁知道如何避免这种情况?本质上,我希望输出与输入相同。(我知道将重新生成xml声明,因为它不是DOM的一部分,但这在这里不是问题。)


问题答案:

根本原因是标准DOM Level 3无法在不违反规范的情况下将Text节点表示为Document的子级。任何兼容的解析器都将删除空格。

Document -- 
    Element (maximum of one),
    ProcessingInstruction,
    Comment,
    DocumentType (maximum of one)

如果您需要一个符合标准的解决方案,并且目标是可读性而不是100%复制,那么我会在您的输出机制中寻找它。



 类似资料:
  • 我是jsoup的新手,在使用非HTML元素(脚本)时遇到了一些困难。我有以下HTML: 用于显示这一点的应用程序知道如何处理 和.语句。因此,当我简单地用jsoup解析文本时,<和>被编码,html被重新组织,所以它不能正确地执行或显示。例如: 我的最终目标是添加一些css和js包含,并修改几个元素属性。那真的不是问题,我已经解决了那么多了。问题是我不知道如何保留非HTML元素,并将格式与原始格式

  • 问题内容: 我正在尝试从XML文档中提取元素(作为字符串)。我已经尝试过此SO答案中建议的两种方法(此处也建议使用类似的方法),但它们都无法正确考虑可能在某些外部文档中定义的名称空间前缀。 使用以下代码: 如果该方法如果传递了以下字符串: 要么 ......都和方法的工作。但是,如果我传递以下同样有效的XML文档,其中在外部元素中定义了名称空间前缀: …然后,这两种方法都会失败,因为它们只是发出:

  • 我确实使用IText通过延迟签名(SignDeferred)将签名应用于pdf文档。该过程包含以下步骤: 为siging准备pdf文档 为pdf文档中的签名预留空间 使用自签名证书 整个过程工作,我以一个pdf文档结束,其中签名被设置并有效。 原始pdf是pdf-A1a,但生成的pdf不再是有效的pdf-A1a。我知道有一个关于IText PDF-a支持的文档(https://kb.itextpd

  • 问题内容: 我在网上找到的大多数示例都显示了如何删除空格-但就我而言,我需要保留它。 我希望保留空白(“ html”变量包含pre标记的内容),但是似乎用一个空格代替了多个空格。 如何保存/获取给定beautifulsoup解析器的原始内容? 问题答案: 如果您要解析的内容在 保留空白。

  • (下的唯一div) 还有更多关于参数的... 我也给了任何其他标签一个镜头,但我得到同样的问题。 最接近成功的是:。这将返回所有视频标题。但可悲的是,也有一些与其他文本的其他链接。因此不可靠。 下面是实现JSOUP的代码: 我尝试提取的示例:我正在查找的HTML块的图像 我好像错过了很多人说Jsoup很棒很简单的东西...(在我的情况下不是:v)