【问题标题】:Remove white space from XML element using java使用java从XML元素中删除空格
【发布时间】:2015-08-18 22:53:54
【问题描述】:

我有一个 JSON 如下

String str = {'Emp name' : 'JSON','Emp id' : 1,'Salary' : 20997.00}

我想使用 java 将此 JSON 转换为 XML。我的 java 代码在这里。

JSON json= JSONSerializer.toJSON(str);
XMLSerializer xmlSerializer = new XMLSerializer();  

//To Skip the white space from XML data and not from XML Element (By default it does)
    xmlSerializer.setSkipWhitespace(true);  
    //To set type of xml element If it true, it will be type
    xmlSerializer.setTypeHintsCompatibility(true);  
    xmlSerializer.setRootName("book");  
    String xml = xmlSerializer.write( json );  
    System.out.println(xml);        

如果我在 XML 元素之间传递没有任何空格的 xml(即 Emp 名称作为 Empname 和 Emp id 作为 Empid),我将得到一个输出。我想从 XML 元素中删除空格,而不是从 XML 元素内容中删除。

【问题讨论】:

  • 所以...当你运行它时究竟会发生什么?你期望输出是什么?
  • 您可以从 json 键而不是 xml 元素中删除空格。你可能想看看stackoverflow.com/questions/30228343/…
  • 获取所有 JSON 键,遍历它们检查空间(仅在键中)并替换它。这行得通吗?

标签: java json xml


【解决方案1】:

我反编译并检查了 json-lib(2.4) 和 xom (1.2.5) 库。不幸的是,没有关于密钥的这样的前/后处理器或处理程序。 这在构建 JSON 或构建 XML 时都适用。

似乎没有其他方法可以手动修复 JSON 的密钥。所以请检查下面的sn-p:

public static void main(String[] args) {

        String str = "{'Emp name' : 'JSON','Emp id' : 1,'Salary' : 20997.00, " +
                "'manager' : {'first name':'hasan', 'last name' : 'kahraman'}," +
                "'co workers': [{'first name':'john', 'last name' : 'wick'}, " +
                "{'first name':'albert', 'last name' : 'smith'}]}";

        JsonConfig config = new JsonConfig();
        JSON json = JSONSerializer.toJSON(str, config);

        fixJsonKey(json);

        XMLSerializer xmlSerializer = new XMLSerializer();
        //To Skip the white space from XML data and not from XML Element (By default it does)
        xmlSerializer.setSkipWhitespace(true);
        //To set type of xml element If it true, it will be type
        xmlSerializer.setTypeHintsCompatibility(true);
        xmlSerializer.setRootName("book");

        String xml = xmlSerializer.write(json);
        System.out.println(xml);
    }

    private static void fixJsonKey(Object json) {

        if (json instanceof JSONObject) {
            JSONObject jsonObject = (JSONObject) json;
            List<String> keyList = new LinkedList<String>(jsonObject.keySet());
            for (String key : keyList) {
                if (!key.matches(".*[\\s\t\n]+.*")) {
                    Object value = jsonObject.get(key);
                    fixJsonKey(value);
                    continue;
                }

                Object value = jsonObject.remove(key);
                String newKey = key.replaceAll("[\\s\t\n]", "");

                fixJsonKey(value);

                jsonObject.accumulate(newKey, value);
            }
        } else if (json instanceof JSONArray) {
            for (Object aJsonArray : (JSONArray) json) {
                fixJsonKey(aJsonArray);
            }
        }
    }

输出如下:

<?xml version="1.0" encoding="UTF-8"?>
<book>
    <Empid type="number">1</Empid>
    <Empname type="string">JSON</Empname>
    <Salary type="number">20997.0</Salary>
    <coworkers class="array">
        <e class="object">
            <firstname type="string">john</firstname>
            <lastname type="string">wick</lastname>
        </e>
        <e class="object">
            <firstname type="string">albert</firstname>
            <lastname type="string">smith</lastname>
        </e>
    </coworkers>
    <manager class="object">
        <firstname type="string">hasan</firstname>
        <lastname type="string">kahraman</lastname>
    </manager>
</book>

【讨论】:

    【解决方案2】:

    如果您可以切换 JSON 框架和/或添加另一个框架,请查看 Jackson。您的问题的一个简单解决方案是 DTO(数据传输对象):

    class Employee {
        private String name;
    
        @JsonProperty("Emp name")
        public String getname() { return name; }
    
        ...setter...
    }
    

    见“Annotations: changing property names

    【讨论】: