【问题标题】:best way for parsing an xml string and trimming spaces for specific tags using java使用java解析xml字符串和修剪特定标签空格的最佳方法
【发布时间】:2015-09-08 13:24:51
【问题描述】:

假设我有一个 xml 格式的字符串

String gandalfSchema = "<Wizard><Name> Gandalf </Name><God Mode>Off</God Mode></Wizard>";

我想删除多个标签值的所有前导和尾随空格;在这种情况下 Gandalf<Name> 中。

我不确定以下方法是否最好:

String nameBeginIndex = gandalfSchema.substring("<Name>");
String nameEndIndex = gandalfSchema.substring("</Name>");
String nameRaw = gandalfSchema.substring(nameBeginIndex+6,nameEndIndex);
String nameProcessed = nameRaw;
String stringBeforeNameRaw = gandalfSchema.substring(nameBeginIndex);
String stringAfterNameRaw = gandalfSchema.substring(nameEndIndex);
gandalfSchema = stringBeforeNameRaw + nameProcessed + stringAfterNameRaw

现在想象一下对 3-4 个标签执行上述操作,我认为这是不好的做法。是否有我可能忽略的 Java 库或约定?

【问题讨论】:

  • 您正在寻找 XML 解析器。这绝对不是最好的方法,因为这不是一个可移植的解决方案。
  • 使用 XML 库(或阅读器)可以轻松遍历整个结构并修复相关的文本节点。一般来说,对于任何外部格式(例如 XML、JSON、Excel),在为此目的设计的工具/库/适配器之外生成、修改或使用原始数据都是“不好的做法”。
  • @Makoto 那你有首选的 XML 阅读器吗?
  • &lt;Gode Mode&gt; 不是有效的 XML 元素。

标签: java xml parsing


【解决方案1】:

您需要的是 XML 解析器。已经有很多可用的了。去谷歌上查询。 为什么要重新发明轮子,除非您尝试自己构建新的解析器(这不太可能)。

【讨论】:

  • XML解析器可以解析&lt;God Mode&gt;吗?
  • 不,他们不能。他们不应该。因为根据 XML 规范, 是无效的 xml 元素名称。问题是关于如何解析 xml,而不是关于 xml 的有效性。
【解决方案2】:

我建议使用 JaxB 并根据您的 xml 实际创建对象

向导类

@XmlRootElement(name="Wizard")
public class Wizard {

    private String name;
    private String godMode;


    public String getName() {
        return this.name;
    }

    @XmlElement(name="Name")
    public void setName(String name) {
        this.name = name;
    }

    public String getGodMode() {
        return this.godMode;
    }

    @XmlElement(name="GodMode")
    public void setGodMode(String godMode) {
        this.godMode = godMode;
    }
}

然后使用 unmarshalled 从 xml 中获取对象

解组器

JAXBContext jaxbContext = JAXBContext.newInstance(Wizard.class);

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

StringReader reader = new StringReader("<Wizard><Name> Gandalf </Name><GodMode>Off</GodMode></Wizard>");
Wizard wizard = (Wizard) unmarshaller.unmarshal(reader);

然后你可以用它做任何你想做的事。此外,“上帝模式”有一个空格,不适用于元素名称(如果可能,请更改此内容,或者您​​可能必须在解组之前对此进行查找替换)。

【讨论】:

  • 如果我将空间从&lt;God Mode&gt; 删除到“GodMode”,那么 jaxb 示例会起作用吗?
  • 是的,它会起作用,我将编组器放到一个 main 方法中并对其进行了测试,您也可以这样做。
  • 谢谢,如果我要将 Wizard 对象转换回字符串,我就将其编组回来,对吗?
【解决方案3】:

您可以将 XSLT 与 Java Transformer API 一起使用。 Here 是一个类似的示例,可以帮助您入门。

【讨论】:

    【解决方案4】:

    是的,使用 Java 附带的 jaxb 并使用任何 IDE,您可以创建 xml 类,并且可以以更好、更简单的方式进行 Marshall 和 uarshall 你需要知道你的 Xsd,如果你准备好了 xml,你就可以上网

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      相关资源
      最近更新 更多