【问题标题】:Building XML document in lowercase or TitleCase - flag based以小写或 TitleCase 构建 XML 文档 - 基于标志
【发布时间】:2014-08-07 15:23:14
【问题描述】:

在我当前的项目中,我们正在重构一个构建 XML 文档的 java 类。在交付给客户的以前版本的产品中,XML 文档是用小写的元素和属性构建的:

<rootElement attr = "abc">
    <childElement childAttr = "xyz"/>
</rootElement>

但是现在我们需要使用 TitleCase 元素和属性来构建 XML 文档。用户将在属性文件中设置一个标志来指示该文档应该以小写还是大写形式构建。如果该标志配置为在 TitleCase 中构建文档,则生成的文档将如下所示:

<RootElement Attr = "abc">
    <ChildElement ChildAttr = "xyz">
</RootElement>

解决问题的各种方法:
1. 插入转换器将小写 XML 文档转换为 TitleCase XML 文档。但这会影响整体性能,因为我们要处理超过 10,000 行的巨大 XML 文件。

2. 使用 corr 创建两个单独的地图。 XML 元素和属性。
例如:
lowercase map: rootelement -&gt; rootElement, attr -&gt; attr ....
TitelCase map: rootlement -&gt; RootElement, attr -&gt; Attr ....
根据用户设置的属性,corr.将选择地图,并使用该地图中的 XML 元素/属性来构建 XML 文档。

3. 使用 enum 定义常量及其 corr。价值观。

public enum XMLConstants {
    ROOTELEMENT("rootElement", "RootElement"),
    ATTRIBUTE("attr", "Attr");

    private String lowerCase;
    private String titleCase;

    private XMLConstants(String aLowerCase, String aTitleCase){
        titleCase = aTitleCase;
        lowerCase = aLowerCase;
    }

    public String getValue(boolean isLowerCase){
        if(isLowerCase){
            return lowerCase;
        } else {
            return titleCase;
        }
    }
}

--------------------------------------------------------------

// XML document builder

if(propertyFlag){
    isLowerCase = false;
} else {
    isLowerCase = true;
}

....
....

createRootElement(ROOTELEMENT.getValue(isLowerCase));
createAttribute(ATTRIBUTE.getValue(isLowerCase));

请帮助我选择正确的选项,同时牢记整个解决方案的性能方面。如果您有任何其他建议,请告诉我。

【问题讨论】:

  • 为什么不将所有标签/属性都小写?然后您的 XML 文件可以包含小写、大写、大写或任何其他形式 - 无论如何您都可以读取 XML 文件
  • 感谢您的评论。不幸的是,我们无法这样做。客户已经在使用该产品并使用小写 XML 文档。所以我们需要确保当前的更改是向后兼容的。构建 TitleCase XML 文档的要求是将我们的系统与期望 XML 输入 TitleCase 的遗留系统集成。
  • 当然可以。每当您解析 XML 标记或属性时,请调用 String.toLower(),然后将其与标记的小写版本进行比较。

标签: java xml enums constants


【解决方案1】:
// set before generate XML
boolean isUpperCase;

// use function for each tag/attribute name instead of string constant
// smth. like getInCase("rootElement")
String getInCase(String initialName) {
    String intialFirstCharacter = initialName.substring(0, 1);
    String actualFirstCharacter;
    if (isUpperCase) {
        actualFirstCharacter = intialFirstCharacter.toUpperCase();
    } else {
        actualFirstCharacter = intialFirstCharacter.toLowerCase();
    }
    return actualFirstCharacter + initialName.substring(1);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多