繁体   English   中英

用于XML到JSON到XML阻抗不匹配的Java库

[英]Java Library for XML to JSON to XML Impedance Mismatch

我需要将XML无损转换为JSON,然后再次使用Java。 我使用了一个名为jsonxml的Javascript库,该库可以正常运行,但Java中没有任何内容。

我似乎最好的发现它是JSON-java ,这在Stack Overflow中经常提到,但是它在很多方面都无法通过测试。

这是我的测试用例代码...

//---------------------------------------------------
import org.json.*;
//---------------------------------------------------
public class rjx
    {
    //-----------------------------------------------
    private String j2x(String json)
        {
        return(XML.toString(new JSONObject(json)));
        }
    //-----------------------------------------------
    private String x2j(String xml)
        {
        return(XML.toJSONObject(xml).toString());
        }
    //-----------------------------------------------
    //-----------------------------------------------
    public static void main(String[] args)
        {
        //-------------------------------------------
        rjx o = new rjx();
        //-------------------------------------------
        try
            {
            String xml = new String();
            String reversed = new String();
            System.out.println("=======");
            xml = "<e/>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e>text</e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e name='value' />";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e name='value'>text</e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><a>text</a><b>text</b></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><a>text</a><a>text</a></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e>text<a>text</a></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<a>hello</a>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<a x='y'>hello</a>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<a id='a'><b id='b'>hey!</b></a>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<a>x<c/>y</a>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<x u=''/>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<html><head><title>Xml/Json</title><meta name='x' content='y' /></head><body></body></html>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<ol class='xoxo'><li>Subject 1<ol><li>subpoint a</li><li>subpoint b</li></ol></li><li><span>Subject 2</span><ol compact='compact'><li>subpoint c</li><li>subpoint d</li></ol></li></ol>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<span class='vevent'><a class='url' href='http://www.web2con.com/'><span class='summary'>Web 2.0 Conference</span><abbr class='dtstart' title='2005-10-05'>October 5</abbr><abbr class='dtend' title='2005-10-08'>7</abbr><span class='location'>Argent Hotel, San Francisco, CA</span></a></span>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><![CDATA[ .. some data .. ]]></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><a /><![CDATA[ .. some data .. ]]><b /></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e>some text<![CDATA[ .. some data .. ]]>more text</e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e>some text<![CDATA[ .. some data .. ]]><a /></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><![CDATA[ .. some data .. ]]><![CDATA[ .. more data .. ]]></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><![CDATA[ .. some data .. ]]><![CDATA[ .. & more data .. ]]></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><![CDATA[ .. some data .. ]]><![PCDATA[ .. &amp; still more data .. ]]></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("=======");
            }
        catch (Exception e)
            {
            System.err.println("error: rjx.main>>" + e.toString());
            System.exit(1);
            }
        System.exit(0);
        }
    //-----------------------------------------------
    }
//---------------------------------------------------

结果是...

=======
<e/>
<e/>
PASS
-------
<e>text</e>
<e>text</e>
PASS
-------
<e name='value' />
<e><name>value</name></e>
FAIL
-------
<e name='value'>text</e>
<e><name>value</name>text</e>
FAIL
-------
<e><a>text</a><b>text</b></e>
<e><a>text</a><b>text</b></e>
PASS
-------
<e><a>text</a><a>text</a></e>
<e><a>text</a><a>text</a></e>
PASS
-------
<e>text<a>text</a></e>
<e><a>text</a>text</e>
FAIL
-------
<a>hello</a>
<a>hello</a>
PASS
-------
<a x='y'>hello</a>
<a><x>y</x>hello</a>
FAIL
-------
<a id='a'><b id='b'>hey!</b></a>
<a><b><id>b</id>hey!</b><id>a</id></a>
FAIL
-------
<a>x<c/>y</a>
<a><c/>x
y</a>
FAIL
-------
<x u=''/>
<x><u/></x>
FAIL
-------
<html><head><title>Xml/Json</title><meta name='x' content='y' /></head><body></body></html>
<html><head><meta><name>x</name>y</meta><title>Xml/Json</title></head><body/></html>
FAIL
-------
<ol class='xoxo'><li>Subject 1<ol><li>subpoint a</li><li>subpoint b</li></ol></li><li><span>Subject 2</span><ol compact='compact'><li>subpoint c</li><li>subpoint d</li></ol></li></ol>
<ol><class>xoxo</class><li><ol><li>subpoint a</li><li>subpoint b</li></ol>Subject 1</li><li><ol><compact>compact</compact><li>subpoint c</li><li>subpoint d</li></ol><span>Subject 2</span></li></ol>
FAIL
-------
<span class='vevent'><a class='url' href='http://www.web2con.com/'><span class='summary'>Web 2.0 Conference</span><abbr class='dtstart' title='2005-10-05'>October 5</abbr><abbr class='dtend' title='2005-10-08'>7</abbr><span class='location'>Argent Hotel, San Francisco, CA</span></a></span>
<span><a><href>http://www.web2con.com/</href><abbr><title>2005-10-05</title><class>dtstart</class>October 5</abbr><abbr><title>2005-10-08</title><class>dtend</class>7</abbr><class>url</class><span><class>summary</class>Web 2.0 Conference</span><span><class>location</class>Argent Hotel, San Francisco, CA</span></a><class>vevent</class></span>
FAIL
-------
<e><![CDATA[ .. some data .. ]]></e>
<e> .. some data .. </e>
FAIL
-------
<e><a /><![CDATA[ .. some data .. ]]><b /></e>
<e><a/><b/> .. some data .. </e>
FAIL
-------
<e>some text<![CDATA[ .. some data .. ]]>more text</e>
<e><array>some text</array><array> .. some data .. </array><array>more text</array></e>
FAIL
-------
<e>some text<![CDATA[ .. some data .. ]]><a /></e>
<e><a/>some text
 .. some data .. </e>
FAIL
-------
<e><![CDATA[ .. some data .. ]]><![CDATA[ .. more data .. ]]></e>
<e><array> .. some data .. </array><array> .. more data .. </array></e>
FAIL
-------
<e><![CDATA[ .. some data .. ]]><![CDATA[ .. & more data .. ]]></e>
<e><array> .. some data .. </array><array> .. &amp; more data .. </array></e>
FAIL
-------
<e><![CDATA[ .. some data .. ]]><![PCDATA[ .. &amp; still more data .. ]]></e>
error: rjx.main>>org.json.JSONException: Expected 'CDATA[' at 41 [character 42 line 1]

是否有一个库,可能是JSON-java的一个分支,可以通过所有测试?

顺便说一句,我可以原谅规范中的订单不匹配失败,但结构更改并非如此。

这取决于您的确切要求。

例如,如果您看到

<p id="foo" class='  x  '>Hello, <i>cruel</i> world.</p   >

如果您得到以下反馈,它算作“无损”吗?

<p class='x' id='foo'>, <i>cruel</i> world.</p>

如果这算不上是无损的,那么将很难进行无损的往返,除非只是在XML中转义和引号,然后将整个内容称为一个JSON字符串。 这当然很容易,但是JSON根本不了解其中的内容。

几乎所有的XML解析器都将丢弃标记内部的空白差异; 这就是设计的行为。 有些也返回属性而不考虑顺序。 对JSON的现成转换可能会将属性放入JSON哈希中,此后它们的原始顺序肯定消失了,因此无法恢复。 还有其他一些问题,例如是否为“&#nbsp;” ==“&#160;” ==“&#xA0;” ....使用“规范XML”(请参阅https://www.w3.org/TR/xml-c14n11/ )将有助于避免此类问题。

但是,我有些困惑,因为我无法想到没有XML解析器可用的环境。 为什么不完全不进行转换,而仅在目标位置解析XML? 听起来好像目的地没有更改数据,因为如果这样做,往返显然将根本无法工作。 而且,如果您发送XML,则目的地可以更轻松地对其进行验证以确保其正常。

另一方面,如果出于您的目的上述示例确实算作“无损”,那么事情会变得容易得多。 因为XML元素具有重要的名称和必须保留的顺序 ,所以使用的任何内容都可能会为每个元素创建JSON数组和JSON哈希。 也许最简单的是:

[ { "#":"p" "id":""foo"" "class":""x"" },
    "Hello, ",
    [ { "#":"i" },
        "cruel"
    ], 
    "world."
]

我不知道执行此操作或等效操作的Javascript或Java库。 我有Python,但仅粘贴到此处有点大。 您可以通过以下方式获得相当接近的效果:

sed -E \
-e 's@>([^<]+)@>"\1"<@g' \ 
-e 's@<([^\s/>]+)(\s+[^>]*)?/>@[{"#":"\1", \2}],@g' \ 
-e 's@<([^\s/>]+)(\s+[^>]*)?>@[{"#":"\1", \2},@g' \
-e 's@<\?(\w+)(\s+([^?]|\?[^>])*)?\?>@[{"#":"#PI", "#target":"\1", \2]}@g' \ 
-e 's@<!--(([^-]|-[^-]|--[^>])*)-->@/* \1 */@g' \ 
-e 's@\s+(\w+)\s*=\s*("[^"]*")@ "\1":"\2",@g' \ 
-e 's@</([^\s/>]+)\s*>@],@g' \ 
-e 's@&#[xX]([0-9a-fA-F]+);@\\u{\1}@g' \ 
-e 's@&lt;@<@g' \ 
-e 's@&gt;@>@g' \ 
-e 's@&amp;@&@g' \ 
-e 's@&lsqb;@[@g' \ 
-e 's@&rsqb;@]@g' \ 
-e 's@"\s*([-+]?\d+(\.\d+)?([eE][-+?]\d+)?)\s*"@\1@g'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM