我想发送下面的 XML 请求。文本内容应该被转义,但标签不应该被转义。
我试过了使用下面的转义逻辑。
String str = escapeXml11(req);
然而,我的整个请求都被逃脱了。因此,它不再是有效的 XML。
我原来的字符串:
String req =
"<request>\r\n"
+ " <Products>\r\n"
+ " <Product>\r\n"
+ " <ProductName>H < M</ProductName>\r\n"
+ " <quantity>1</quantity>\r\n"
+ " <totalProductCost>17.03</totalProductCost>\r\n"
+ " </Product>\r\n"
+ " </Products>\r\n"
+ "</request>";
逃脱后:
<request>
<ProductName>H < M</ProductName>
<quantity>1</quantity>
<totalProductCost>17.03</totalProductCost>
</request>
预期结果:
<request>
<ProductName>H < M</ProductName>
<quantity>1</quantity>
<totalProductCost>17.03</totalProductCost>
</request>
如何只转义文本内容?
所以这个问题的根源是第三方提供给你的“XML”格式不正确。
<request>
<Products>
<Product>
<ProductName>H < M</ProductName>
<quantity>1</quantity>
<totalProductCost>17.03</totalProductCost>
</Product>
</Products>
</request>
要纠正此问题,您需要将"H < M"
to "H < M"
。对于人类来说很容易做到这一点,如果人类必须做很多这样的事情,则模精度会出现问题。但实现自动化却很困难。
显然,仅仅调用转义方法是行不通的。如果不解析 XML,转义方法无法确定需要转义的内容。 (像这样的方法escapeXml11
仅当整个字符串需要转义时才有效。)
普通的 XML 解析器会看到"< M"
尝试将其视为元素标签的开始。然后它会看到下一个"<"
...和错误。为了进一步进行,它必须回溯到"< M"
并治疗"<"
仿佛逃脱了.
我知道有一种 HTML / XML 解析器 (JSoup) 可以处理错位的情况"<"
人物。但是,如果我理解正确,那么对于您的用例来说,它会以错误的方式处理这个问题。而不是治疗"< M"
作为数据,它将把它变成一个开始标签:
<request>
<Products>
<Product>
<ProductName>H <M></ProductName>
<quantity>1</quantity>
<totalProductCost>17.03</totalProductCost>
</Product>
</Products>
</request>
这给你留下了两种选择:
您可以尝试通过一些模式匹配来检测并修复问题。例如,如果您知道格式错误的数据位于<ProductName>...</ProductName>
元素,然后您可以使用正则表达式来搜索这些元素,检查并(如果需要)更正内容,然后替换它。
您可以使用上下文相关的词法分析器为 XML 编写自定义解析器。当解析器看到一个<ProductName>
,它将词法分析器切换到处理“的不同模式”<
“ 作为数据unless这是开始</ProductName>
.
但在您花时间和金钱编写一堆自定义代码来处理这个无效的 XML 之前:
另请参阅@Michael Kay 的评论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)