Java 在XML中存储值NUL(ASCII)

Java 在XML中存储值NUL(ASCII),java,xml,Java,Xml,是否可以像这样将ASCII NUL字符保存在XML中*NUL**NUL**NUL* 我知道我可以使用System.out.println(“\0”)在Java中显示这个值,我想知道XML是否可以处理这个值 *我的目标是使用Java从XML中获取“\0\0\0” 提前谢谢你 这些是数据可能看起来像什么的可能性 <row> <data>actual data</data>

是否可以像这样将ASCII NUL字符保存在XML中
*NUL**NUL**NUL*

我知道我可以使用
System.out.println(“\0”)
在Java中显示这个值,我想知道XML是否可以处理这个值

*我的目标是使用Java从XML中获取“\0\0\0”


提前谢谢你

这些是数据可能看起来像什么的可能性

              <row>
                  <data>actual data</data>
              </row>
              <row>
                  <!--null using attr. n ="t"-->
                  <data n="t"></data>
              </row>
              <row>
                  <!--some other meaning-->
                  <data/>
              </row>

实际数据
编辑:如果要表示多个空值,请使用属性路由并更改属性以表示空值的数量

              <row>
                  <!--null using attr. n ="3"-->
                  <data n="3"></data>
              </row>

在本例中是三个空值

编辑:这是有效的XML

              <row>
                  <data>\0</data>
              </row>

\0
您的XML处理者可能不喜欢它,但它没有任何问题。

按规定,它是不被正式允许的

ASCII NUL aka
'\0'
aka
\u0000
在java中是一个普通字符。然而,在C/C++中,它被用作字符串终止符。因此,当C软件处理XML时,它可能会过早地检测到XML文本的结尾

对于这种情况,java也有一个解决方案,即当XML以UTF-8编码方式写入时,Unicode值>127以第8位1的多字节序列编码
DataOutputStream.writeUTF8
也将'\0'写入多字节序列。因此,它被正常读取,并且解码工作正常

  • 这并不是要求最短编码的完全严格的UTF-8
  • 我仍然不能确定C语言在处理XMLDOM时是否存在错误
所以这不是一个好主意


还请记住,二进制数据应该转换为Base64 ASCII。因为UTF-8不适合二进制数据。

我没有读过XML标准,但是由于Python的ElementTree抱怨它不是有效的XML字符,我认为XML不支持它。您可以实现转义机制并用
“\\0”
表示
“\0”
。另一种可能性是使用公共Base64编码

在Java中,它可能如下所示:

// write data to element
String data = ...
element.setText(Base64.getEncoder().encodeToString(data.getBytes("UTF-8")))

// read data from element
String data = new String(Base64.getDecoder().decode(element.getText())), "UTF-8")
XML 1.0和1.1中不允许NUL(U+0000)

维基百科:

注意,分配给空控件的代码点U+0000 字符,是唯一以Unicode和ISO/IEC 10646编码的字符 这在任何XML1.0和1.1文档中都是无效的


您是否试图区分和Null?如果您正在这样做的话,这可能是使用属性的好地方。我不知道XML是否允许“\0”,但Python的ElementTree库不支持它。我得到“ValueError:所有字符串必须与XML兼容:Unicode或ASCII,没有空字节或控制字符”。也许您可以使用Base64编码来保存包含NUL字节的数据。在这种情况下使用它是很常见的。仅供参考:XML文档可以使用多种字符编码之一进行存储或传输。但是,所有字符在语义上都是Unicode。此外,Java字符串,如“\0\0\0”也是Unicode。尽管NULL是Unicode与ASCII的一个共同字符,但Unicode字符描述并没有将U+0000称为“ASCII NULL”。就我理解的问题而言,他并不是在谈论编程语言中使用的
NULL
。我想他想保存包含
NUL
的数据。但也许我错了。@JojOatXGME-我明白了,我不理解空数据和使用字符指定数据为空之间的区别。是的,ASCII中的空值。检查ASCII表,您就知道我的意思了。@dbasnett我想用Java从XML中获取字符串“\0”。@dbasnett一个字节可以有256个不同的值。其中之一是
NUL
。例如,您可能希望传输XML格式的文件内容。文件在某些位置可能包含
NUL
,因此必须表示它。您的回答中描述的这种解决方案可以扩展到支持这种情况,但我认为这不是直截了当的。我认为更重要的问题是XML是否支持这种字符。如果是这样的话,实现应该知道这一点。但我不认为它得到支持。@JojOatXGME你说得很对。我添加了一个关于这一效果的参考+1.