Ascii转XML字符集转换

3
有没有用于将ASCII转换为XML字符集的类,最好是开源的。我将在VC ++或C#中使用此类。
我的ASCII字符集中有一些可打印字符,但在XML字符集中不存在。
我试图发送一份简历,其中包含ASCII字符集,并尝试将其存储在在线CRM中,但是我收到了以下错误消息:
javax.xml.bind.UnmarshalException - 带有链接异常:[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[50,22] Message: Character reference "&#x13" is an invalid XML character.]
提前致谢。

你的 ASCII 字符集是否包含非打印字符? - o.k.w
你的意思是像 '<' 转换成 '<' 吗? - Elisha
你可以举个例子说明你期望的转换吗? - Greg Hewgill
“xml字符集”是指在xml中用于引入某些字符的转义序列(例如<等)吗? - mjv
6个回答

8

我在使用C#创建OpenXML文档时,遇到了和Excel相同的问题。

当构建一个包含错误ASCII字符的文档时,我的Excel导出功能就会崩溃。

一些公司数据库中的字符串数据含有奇怪的字符。

虽然我使用了Microsoft的DocumentFormat.OpenXML程序集从他们的OpenXML SDK 2.0中分配字符串值,但它仍未解决这个问题。

解决方法:

t.Text = Regex.Replace(sValue, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]", "?");

该方法通过删除有问题的字符并用问号替换它们来清理sValue字符串。您可以用任何字符串替换或仅使用空字符串。

XML规范允许0x09(TAB)、0x0A(LF-换行符或NL-新行)和0x0D(CR-回车)。上面的正则表达式确保不会删除这些字符。

XML 1.1规范允许您对其中一些字符进行转义。
例如:使用&#x03;代替0x03,在HTML中显示为,在Office文档和记事本中显示为L
我使用Asp.net,这在我的GridView中自动处理,因此我不需要替换这些值-但我认为可能是浏览器为所有我所知道的内容负责。

我考虑在OpenXML中转义这些值,但是当我查看输出时,它显示了转义标记。因此,Mike&#x03;TeeVee仍然显示为Mike&#x03;TeeVee在Excel中,而不是像MikeTeeVee或MikeLTeeVee之类的东西。这就是为什么我更喜欢Mike?TeeVee的方法。

我猜想这是当前OpenXML中的一个错误,它对允许的XML ASCII字符进行编码,但允许不受支持的ASCII字符通过。

更新:

我忘了我可以使用“Open XML SDK 2.0 Productivity Tool”查找这些字符如何在文档中显示,例如Excel。
在那里,我发现它使用格式:_x0000_

请记住:XML 1.0不支持转义这些值,但XML 1.1支持,因此如果您使用1.1,则可以使用此代码进行转义。

常规XML 1.1转义:

t.Text = Regex.Replace(s, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]",
         delegate(Match m)
         {
           return (byte)(m.Value[0]) == 0 //0x00 is not Supported in 1.0 or 1.1
                  ? ""
                  : ("&#x" + string.Format("{0:00}", (byte)(m.Value[0])) + ";");
         });

如果您正在为OpenXML转义字符串,请使用以下方法:
t.Text = Regex.Replace(s, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]",
         delegate(Match m)
         {
           return (byte)(m.Value[0]) == 0 //0x00 is not Supported in 1.0 or 1.1
                  ? ""
                  : ("_x" + string.Format("{0:0000}", (byte)(m.Value[0])) + "_");
         });

7

您的文本不会有任何在XML中不可用的可打印字符,但它可能有一些在XML中不可用的不可打印字符。

特别地,Unicode值U+0000到U+001F是无效的,除了制表符、回车和换行符。如果您确实需要这些其他控制字符,则必须为它们创建自己的转义形式,并在另一端取消转义。


1
如果您有兴趣,我的答案提供了处理此问题的代码。https://dev59.com/dErSa4cB1Zd3GeqPVU8B#9987636 - MikeTeeVee

3

1

出于好奇,我花了几分钟时间用C#编写了一个简单的程序来生成包含128个ASCII字符的XML字符串。令我惊讶的是,.NET没有输出一个真正有效的XML文档。我猜测我输出元素文本的方式可能不太正确。无论如何,以下是代码(欢迎评论):

XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "us-ascii", ""));
XmlElement elem = doc.CreateElement("ASCII");
doc.AppendChild(elem);
byte[] b = new byte[1];
for (int i = 0; i < 128; i++)
{
    b[0] = Convert.ToByte(i);
    XmlElement e = doc.CreateElement("ASCII_" + i.ToString().PadLeft(3,'0'));
    e.InnerText = System.Text.ASCIIEncoding.ASCII.GetString(b);
    elem.AppendChild(e);
}
Console.WriteLine(doc.OuterXml);

这是格式化输出:

<?xml version="1.0" encoding="us-ascii" ?>
    <ASCII>
    <ASCII_000>&#x0;</ASCII_000>
    <ASCII_001>&#x1;</ASCII_001>
    <ASCII_002>&#x2;</ASCII_002>
    <ASCII_003>&#x3;</ASCII_003>
    <ASCII_004>&#x4;</ASCII_004>
    <ASCII_005>&#x5;</ASCII_005>
    <ASCII_006>&#x6;</ASCII_006>
    <ASCII_007>&#x7;</ASCII_007>
    <ASCII_008>&#x8;</ASCII_008>
    <ASCII_009> </ASCII_009>
    <ASCII_010>
    </ASCII_010>
    <ASCII_011>&#xB;</ASCII_011>
    <ASCII_012>&#xC;</ASCII_012>
    <ASCII_013>
    </ASCII_013>
    <ASCII_014>&#xE;</ASCII_014>
    <ASCII_015>&#xF;</ASCII_015>
    <ASCII_016>&#x10;</ASCII_016>
    <ASCII_017>&#x11;</ASCII_017>
    <ASCII_018>&#x12;</ASCII_018>
    <ASCII_019>&#x13;</ASCII_019>
    <ASCII_020>&#x14;</ASCII_020>
    <ASCII_021>&#x15;</ASCII_021>
    <ASCII_022>&#x16;</ASCII_022>
    <ASCII_023>&#x17;</ASCII_023>
    <ASCII_024>&#x18;</ASCII_024>
    <ASCII_025>&#x19;</ASCII_025>
    <ASCII_026>&#x1A;</ASCII_026>
    <ASCII_027>&#x1B;</ASCII_027>
    <ASCII_028>&#x1C;</ASCII_028>
    <ASCII_029>&#x1D;</ASCII_029>
    <ASCII_030>&#x1E;</ASCII_030>
    <ASCII_031>&#x1F;</ASCII_031>
    <ASCII_032> </ASCII_032>
    <ASCII_033>!</ASCII_033>
    <ASCII_034>"</ASCII_034>
    <ASCII_035>#</ASCII_035>
    <ASCII_036>$</ASCII_036>
    <ASCII_037>%</ASCII_037>
    <ASCII_038>&amp;</ASCII_038>
    <ASCII_039>'</ASCII_039>
    <ASCII_040>(</ASCII_040>
    <ASCII_041>)</ASCII_041>
    <ASCII_042>*</ASCII_042>
    <ASCII_043>+</ASCII_043>
    <ASCII_044>,</ASCII_044>
    <ASCII_045>-</ASCII_045>
    <ASCII_046>.</ASCII_046>
    <ASCII_047>/</ASCII_047>
    <ASCII_048>0</ASCII_048>
    <ASCII_049>1</ASCII_049>
    <ASCII_050>2</ASCII_050>
    <ASCII_051>3</ASCII_051>
    <ASCII_052>4</ASCII_052>
    <ASCII_053>5</ASCII_053>
    <ASCII_054>6</ASCII_054>
    <ASCII_055>7</ASCII_055>
    <ASCII_056>8</ASCII_056>
    <ASCII_057>9</ASCII_057>
    <ASCII_058>:</ASCII_058>
    <ASCII_059>;</ASCII_059>
    <ASCII_060>&lt;</ASCII_060>
    <ASCII_061>=</ASCII_061>
    <ASCII_062>&gt;</ASCII_062>
    <ASCII_063>?</ASCII_063>
    <ASCII_064>@</ASCII_064>
    <ASCII_065>A</ASCII_065>
    <ASCII_066>B</ASCII_066>
    <ASCII_067>C</ASCII_067>
    <ASCII_068>D</ASCII_068>
    <ASCII_069>E</ASCII_069>
    <ASCII_070>F</ASCII_070>
    <ASCII_071>G</ASCII_071>
    <ASCII_072>H</ASCII_072>
    <ASCII_073>I</ASCII_073>
    <ASCII_074>J</ASCII_074>
    <ASCII_075>K</ASCII_075>
    <ASCII_076>L</ASCII_076>
    <ASCII_077>M</ASCII_077>
    <ASCII_078>N</ASCII_078>
    <ASCII_079>O</ASCII_079>
    <ASCII_080>P</ASCII_080>
    <ASCII_081>Q</ASCII_081>
    <ASCII_082>R</ASCII_082>
    <ASCII_083>S</ASCII_083>
    <ASCII_084>T</ASCII_084>
    <ASCII_085>U</ASCII_085>
    <ASCII_086>V</ASCII_086>
    <ASCII_087>W</ASCII_087>
    <ASCII_088>X</ASCII_088>
    <ASCII_089>Y</ASCII_089>
    <ASCII_090>Z</ASCII_090>
    <ASCII_091>[</ASCII_091>
    <ASCII_092>\</ASCII_092>
    <ASCII_093>]</ASCII_093>
    <ASCII_094>^</ASCII_094>
    <ASCII_095>_</ASCII_095>
    <ASCII_096>`</ASCII_096>
    <ASCII_097>a</ASCII_097>
    <ASCII_098>b</ASCII_098>
    <ASCII_099>c</ASCII_099>
    <ASCII_100>d</ASCII_100>
    <ASCII_101>e</ASCII_101>
    <ASCII_102>f</ASCII_102>
    <ASCII_103>g</ASCII_103>
    <ASCII_104>h</ASCII_104>
    <ASCII_105>i</ASCII_105>
    <ASCII_106>j</ASCII_106>
    <ASCII_107>k</ASCII_107>
    <ASCII_108>l</ASCII_108>
    <ASCII_109>m</ASCII_109>
    <ASCII_110>n</ASCII_110>
    <ASCII_111>o</ASCII_111>
    <ASCII_112>p</ASCII_112>
    <ASCII_113>q</ASCII_113>
    <ASCII_114>r</ASCII_114>
    <ASCII_115>s</ASCII_115>
    <ASCII_116>t</ASCII_116>
    <ASCII_117>u</ASCII_117>
    <ASCII_118>v</ASCII_118>
    <ASCII_119>w</ASCII_119>
    <ASCII_120>x</ASCII_120>
    <ASCII_121>y</ASCII_121>
    <ASCII_122>z</ASCII_122>
    <ASCII_123>{</ASCII_123>
    <ASCII_124>|</ASCII_124>
    <ASCII_125>}</ASCII_125>
    <ASCII_126>~</ASCII_126>
    <ASCII_127></ASCII_127>
</ASCII>

更新:
添加了带有“us-ascii”编码的XML声明


0

0
你不需要额外的库来做这件事。从不同的编码方式到嵌入式二进制数据,所有这些都可以通过共同的 .net 库实现。你能举一个简单的例子吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接