Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XStream将XML转换为JSON时忽略空格_Java_Xml_Json_Xstream - Fatal编程技术网

Java 使用XStream将XML转换为JSON时忽略空格

Java 使用XStream将XML转换为JSON时忽略空格,java,xml,json,xstream,Java,Xml,Json,Xstream,我正在尝试建立一种使用Java将XML转换为JSON的可靠、快速的方法,我已经开始使用它来执行这项任务。但是,当我运行下面的代码时,测试由于空格(包括换行符)而失败,如果我删除这些字符,那么测试将通过 @Test public void testXmlWithWhitespaceBeforeStartElementCanBeConverted() throws Exception { String xml = "<root&g

我正在尝试建立一种使用Java将XML转换为JSON的可靠、快速的方法,我已经开始使用它来执行这项任务。但是,当我运行下面的代码时,测试由于空格(包括换行符)而失败,如果我删除这些字符,那么测试将通过

    @Test
    public void testXmlWithWhitespaceBeforeStartElementCanBeConverted() throws Exception {
        String xml =
                "<root>\n" +
                "   <foo>bar</foo>\n" + // remove the newlines and white space to make the test pass
                "</root>";
        String expectedJson = "{\"root\": {\n" +
                "  \"foo\": bar\n" +
                "}}";
        String actualJSON = transformXmlToJson(xml);

        Assert.assertEquals(expectedJson, actualJSON);
    }

    private String transformXmlToJson(String xml) throws XmlPullParserException {
        XmlPullParser parser =  XppFactory.createDefaultParser();
        HierarchicalStreamReader reader = new XppReader(new StringReader(xml), parser, new NoNameCoder());
        StringWriter write = new StringWriter();
        JsonWriter jsonWriter = new JsonWriter(write);
        HierarchicalStreamCopier copier = new HierarchicalStreamCopier();
        copier.copy(reader, jsonWriter);
        jsonWriter.close();
        return write.toString();
    }
有没有办法告诉复制过程忽略可忽略的空白。我找不到任何明显的方法来促成这种行为,但我认为应该存在。我知道我可以预处理XML以删除空白,或者使用其他库

更新 我可以使用HierarchycalStreamReader接口的装饰器并手动抑制空白节点来解决这个问题,但这仍然感觉不太理想。这看起来像下面的代码,这将使测试通过

    public class IgnoreWhitespaceHierarchicalStreamReader implements HierarchicalStreamReader {
        private HierarchicalStreamReader innerHierarchicalStreamReader;

        public IgnoreWhitespaceHierarchicalStreamReader(HierarchicalStreamReader hierarchicalStreamReader) {
            this.innerHierarchicalStreamReader = hierarchicalStreamReader;
        }

        public String getValue() {
            String getValue = innerHierarchicalStreamReader.getValue();
            System.out.printf("getValue = '%s'\n", getValue);
            if(innerHierarchicalStreamReader.hasMoreChildren() && getValue.length() >0)         {
                if(getValue.matches("^\\s+$")) {
                    System.out.printf("*** White space value suppressed\n");
                    getValue = "";
                }
            }
            return getValue;
        }
        // rest of interface ...

非常感谢您的帮助。

将两个XML作为字符串对象进行比较不是一个好主意。当xml相同但节点顺序不同时,您将如何处理这种情况

e、 g

12
类似于

<xml><node2>2</node2><node1>1</node1></xml>
21
但是,当您进行字符串比较时,它总是返回false

相反,请使用XMLUnit之类的工具。有关更多详细信息,请参阅以下链接


谢谢您的回复,但我不知道在哪里比较XML。你的意思是在我删除空白的除颤器内吗?我的意思是当你调用Assert.assertEquals时。这两个参数都是字符串对象,因此将调用String.equals()方法。相反,您必须创建XMLObject类重写它的equals方法来进行XML比较。我同意,如果JSON字符串的内容可能不准确,因此测试可能会失败(但我没有走那么远),我应该测试等价性。测试仅以这种方式显示是为了简洁,而不是引发异常的原因。
<xml><node1>1</node1><node2>2</node2></xml>
<xml><node2>2</node2><node1>1</node1></xml>