<blockquote&amp;amp;gt;解析包含特殊字符的XML需依赖标准解析器和正确编码。XML通过预定义实体(如</blockquote&amp;amp;gt;<p&amp;amp;gt;<img src=&amp;amp;quot;https://img.php.cn/upload/article/001/221/864/175868310259631.jpg&amp;amp;quot; alt=&amp;amp;quot;如何解析包含特殊字符的xml&amp;amp;quot;&amp;amp;gt;</p&amp;amp;gt;<p&amp;amp;gt;解析包含特殊字符的XML,核心在于理解XML的实体
</div&amp;amp;gt;<p&amp;amp;gt;可以看到,<code&amp;amp;gt;ElementTree</code&amp;amp;gt;自动处理了<code&amp;amp;gt;&amp;amp;amp;</code&amp;amp;gt;、<code&amp;amp;gt;<</code&amp;amp;gt;、<code&amp;amp;gt;&amp;amp;quot;</code&amp;amp;gt;、<code&amp;amp;gt;'</code&amp;amp;gt;以及CDATA节和字符引用<code&amp;amp;gt;©</code&amp;amp;gt;,并且正确地处理了中文字符。</p&amp;amp;gt;<p&amp;amp;gt;<strong&amp;amp;gt;Java</strong&amp;amp;gt;</p&amp;amp;gt;<p&amp;amp;gt;Java提供了多种XML解析API,其中DOM(Document Object Model)解析器是最常用的一种,它将整个XML文档加载到内存中,形成一个树形结构。</p&amp;amp;gt;<div class=&amp;amp;quot;code&amp;amp;quot; style=&amp;amp;quot;position:relative; padding:0px; margin:0px;&amp;amp;quot;&amp;amp;gt;<pre class='brush:java;toolbar:false;'&amp;amp;gt;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.ByteArrayInputStream;import java.nio.charset.StandardCharsets;public class XmlParserExample { public static void main(String[] args) { String xmlString = &amp;amp;amp;quot;&amp;amp;amp;lt;?xml version=\&amp;amp;amp;quot;1.0\&amp;amp;amp;quot; encoding=\&amp;amp;amp;quot;UTF-8\&amp;amp;amp;quot;?&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot;&amp;amp;amp;lt;root&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;item id=\&amp;amp;amp;quot;1\&amp;amp;amp;quot;&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;title&amp;amp;amp;gt;A &amp;amp;amp;amp; B Company&amp;amp;amp;lt;/title&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;description&amp;amp;amp;gt;This is a with &amp;amp;amp;quot;quotes&amp;amp;amp;quot; and &amp;amp;amp;amp;apos;apostrophes&amp;amp;amp;amp;apos;.&amp;amp;amp;lt;/description&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;data_block&amp;amp;amp;gt;&amp;amp;amp;lt;![CDATA[&amp;amp;amp;lt;p&amp;amp;amp;gt;This is &amp;amp;amp;lt;b&amp;amp;amp;gt;raw HTML&amp;amp;amp;lt;/b&amp;amp;amp;gt; content with &amp;amp;amp;amp; special chars.&amp;amp;amp;lt;/p&amp;amp;amp;gt;]]&amp;amp;amp;gt;&amp;amp;amp;lt;/data_block&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;copyright&amp;amp;amp;gt;&amp;amp;amp;amp;#169; 2023 All Rights Reserved.&amp;amp;amp;lt;/copyright&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;/item&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;item id=\&amp;amp;amp;quot;2\&amp;amp;amp;quot;&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;name&amp;amp;amp;gt;特殊字符测试&amp;amp;amp;lt;/name&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot; &amp;amp;amp;lt;/item&amp;amp;amp;gt;\n&amp;amp;amp;quot; + &amp;amp;amp;quot;&amp;amp;amp;lt;/root&amp;amp;amp;gt;&amp;amp;amp;quot;; try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // 使用UTF-8编码读取字符串 Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8))); // 获取根元素 Element root = document.getDocumentElement(); // 获取所有item元素 NodeList itemList = root.getElementsByTagName(&amp;amp;amp;quot;item&amp;amp;amp;quot;); for (int i = 0; i &amp;amp;amp;lt; itemList.getLength(); i++) { Element item = (Element) itemList.item(i); String itemId = item.getAttribute(&amp;amp;amp;quot;id&amp;amp;amp;quot;); String title = getTextContent(item, &amp;amp;amp;quot;title&amp;amp;amp;quot;); String description = getTextContent(item, &amp;amp;amp;quot;description&amp;amp;amp;quot;); String dataBlock = getTextContent(item, &amp;amp;amp;quot;data_block&amp;amp;amp;quot;); String copyrightText = getTextContent(item, &amp;amp;amp;quot;copyright&amp;amp;amp;quot;); String name = getTextContent(item, &amp;amp;amp;quot;name&amp;amp;amp;quot;); System.out.println(&amp;amp;amp;quot;Item ID: &amp;amp;amp;quot; + itemId); System.out.println(&amp;amp;amp;quot; Title: &amp;amp;amp;quot; + title); System.out.println(&amp;amp;amp;quot; Description: &amp;amp;amp;quot; + description); System.out.println(&amp;amp;amp;quot; Data Block: &amp;amp;amp;quot; + dataBlock); System.out.println(&amp;amp;amp;quot; Copyright: &amp;amp;amp;quot; + copyrightText); System.out.println(&amp;amp;amp;quot; Name: &amp;amp;amp;quot; + name); System.out.println(&amp;amp;amp;quot;——————–&amp;amp;amp;quot;); } } catch (Exception e) { e.printStackTrace(); } } // 辅助方法,安全获取元素文本内容 private static String getTextContent(Element parentElement, String tagName) { NodeList nodeList = parentElement.getElementsByTagName(tagName); if (nodeList != null &amp;amp;amp;amp;&amp;amp;amp;amp; nodeList.getLength() &amp;amp;amp;gt; 0) { return nodeList.item(0).getTextContent(); } return &amp;amp;amp;quot;N/A&amp;amp;amp;quot;; }}</pre&amp;amp;gt;
</div&amp;amp;gt;<p&amp;amp;gt;Java的DOM解析器同样能无缝处理这些实体和CDATA节,<code&amp;amp;gt;getTextContent()</code&amp;amp;gt;方法会返回解码后的字符串。</p&amp;amp;gt;<p&amp;amp;gt;<strong&amp;amp;gt;C#</strong&amp;amp;gt;</p&amp;amp;gt;<p&amp;amp;gt;C#/.NET框架提供了<code&amp;amp;gt;System.Xml</code&amp;amp;gt;命名空间,其中<code&amp;amp;gt;XmlDocument</code&amp;amp;gt;和<code&amp;amp;gt;XDocument</code&amp;amp;gt;(LINQ to XML)是解析XML的常用类。<code&amp;amp;gt;XDocument</code&amp;amp;gt;通常更推荐,因为它提供了更现代、更易用的API。</p&amp;amp;gt;<div class=&amp;amp;quot;code&amp;amp;quot; style=&amp;amp;quot;position:relative; padding:0px; margin:0px;&amp;amp;quot;&amp;amp;gt;<pre class='brush:csharp;toolbar:false;'&amp;amp;gt;using System;using System.Xml.Linq;using System.Linq;public class XmlParserExample{ public static void Main(string[] args) { string xmlString = @&amp;amp;amp;quot;&amp;amp;amp;lt;?xml version=&amp;amp;amp;quot;&amp;amp;amp;quot;1.0&amp;amp;amp;quot;&amp;amp;amp;quot; encoding=&amp;amp;amp;quot;&amp;amp;amp;quot;UTF-8&amp;amp;amp;quot;&amp;amp;amp;quot;?&amp;amp;amp;gt;&amp;amp;amp;lt;root&amp;amp;amp;gt; &amp;amp;amp;lt;item id=&amp;amp;amp;quot;&amp;amp;amp;quot;1&amp;amp;amp;quot;&amp;amp;amp;quot;&amp;amp;amp;gt; &amp;amp;amp;lt;title&amp;amp;amp;gt;A &amp;amp;amp;amp; B Company&amp;amp;amp;lt;/title&amp;amp;amp;gt; &amp;amp;amp;lt;description&amp;amp;amp;gt;This is a with &amp;amp;amp;quot;quotes&amp;amp;amp;quot; and &amp;amp;amp;amp;apos;apostrophes&amp;amp;amp;amp;apos;.&amp;amp;amp;lt;/description&amp;amp;amp;gt; &amp;amp;amp;lt;data_block&amp;amp;amp;gt;&amp;amp;amp;lt;![CDATA[&amp;amp;amp;lt;p&amp;amp;amp;gt;This is &amp;amp;amp;lt;b&amp;amp;amp;gt;raw HTML&amp;amp;amp;lt;/b&amp;amp;amp;gt; content with &amp;amp;amp;amp; special chars.&amp;amp;amp;lt;/p&amp;amp;amp;gt;]]&amp;amp;amp;gt;&amp;amp;amp;lt;/data_block&amp;amp;amp;gt; &amp;amp;amp;lt;copyright&amp;amp;amp;gt;&amp;amp;amp;amp;#169; 2023 All Rights Reserved.&amp;amp;amp;lt;/copyright&amp;amp;amp;gt; &amp;amp;amp;lt;/item&amp;amp;amp;gt; &amp;amp;amp;lt;item id=&amp;amp;amp;quot;&amp;amp;amp;quot;2&amp;amp;amp;quot;&amp;amp;amp;quot;&amp;amp;amp;gt; &amp;amp;amp;lt;name&amp;amp;amp;gt;特殊字符测试&amp;amp;amp;lt;/name&amp;amp;amp;gt; &amp;amp;amp;lt;/item&amp;amp;amp;gt;&amp;amp;amp;lt;/root&amp;amp;amp;gt;&amp;amp;amp;quot;; try { // 从字符串加载XML XDocument doc = XDocument.Parse(xmlString); // 遍历所有item元素 foreach (var item in doc.Descendants(&amp;amp;amp;quot;item&amp;amp;amp;quot;)) { string itemId = item.Attribute(&amp;amp;amp;quot;id&amp;amp;amp;quot;)?.Value ?? &amp;amp;amp;quot;N/A&amp;amp;amp;quot;; string title = item.Element(&amp;amp;amp;quot;title&amp;amp;amp;quot;)?.Value ?? &amp;amp;amp;quot;N/A&amp;amp;amp;quot;; string description = item.Element(&amp;amp;amp;quot;description&amp;amp;amp;quot;)?.Value ?? &amp;amp;amp;quot;N/A&amp;amp;amp;quot;; string dataBlock = item.Element(&amp;amp;amp;quot;data_block&amp;amp;amp;quot;)?.Value ?? &amp;amp;amp;quot;N/A&amp;amp;amp;quot;; string copyrightText = item.Element(&amp;amp;amp;quot;copyright&amp;amp;amp;quot;)?.Value ?? &amp;amp;amp;quot;N/A&amp;amp;amp;quot;; string name = item.Element(&amp;amp;amp;quot;name&amp;amp;amp;quot;)?.Value ?? &amp;amp;amp;quot;N/A&amp;amp;amp;quot;; Console.WriteLine($&amp;amp;amp;quot;Item ID: {itemId}&amp;amp;amp;quot;); Console.WriteLine($&amp;amp;amp;quot; Title: {title}&amp;amp;amp;quot;); Console.WriteLine($&amp;amp;amp;quot; Description: {description}&amp;amp;amp;quot;); Console.WriteLine($&amp;amp;amp;quot; Data Block: {dataBlock}&amp;amp;amp;quot;); Console.WriteLine($&amp;amp;amp;quot; Copyright: {copyrightText}&amp;amp;amp;quot;); Console.WriteLine($&amp;amp;amp;quot; Name: {name}&amp;amp;amp;quot;); Console.WriteLine(&amp;amp;amp;quot;——————–&amp;amp;amp;quot;); } } catch (System.Xml.XmlException ex) { Console.WriteLine($&amp;amp;amp;quot;XML解析错误: {ex.Message}&amp;amp;amp;quot;); } catch (Exception ex) { Console.WriteLine($&amp;amp;amp;quot;发生未知错误: {ex.Message}&amp;amp;amp;quot;); } }}</pre&amp;amp;gt;
</div&amp;amp;gt;<p&amp;amp;gt;C#的<code&amp;amp;gt;XDocument.Parse()</code&amp;amp;gt;方法同样会自动处理XML实体和CDATA节,并正确解码。</p&amp;amp;gt;<p&amp;amp;gt;在所有这些例子中,你几乎不需要为特殊字符做任何额外的工作。只要XML本身是well-formed(格式良好),并且编码声明正确,解析器就会为你处理好一切。</p&amp;amp;gt;<h3&amp;amp;gt;处理特殊字符时,常见的错误和最佳实践是什么?</h3&amp;amp;gt;<p&amp;amp;gt;即使有强大的解析器,在处理包含特殊字符的XML时,我们仍然可能遇到一些问题。理解这些常见错误并遵循最佳实践,能让我们的工作更顺畅。</p&amp;amp;gt;<p&amp;amp;gt;<strong&amp;amp;gt;常见的错误:</strong&amp;amp;gt;</p&amp;amp;gt;以上就是如何解析包含特殊字符的XML的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1431360.html
微信扫一扫
支付宝扫一扫