首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Java中剥离无效的XML字符

在Java中剥离无效的XML字符,可以使用XML解析器。以下是剥离无效字符的代码示例:

代码语言:java
复制
import org.xml.sax.*;
import java.io.*;

public class StripInvalidXmlChars {
   public static void main(String[] args) throws Exception {
      String inputText = "Hello, world!";
      String strippedText = stripInvalidXmlChars(inputText);
      System.out.println("Original Text: \n" + inputText);
      System.out.println("Stripped Text: \n" + strippedText);
   }

   public static String stripInvalidXmlChars(String inputText) throws SAXException {
      XMLReader xmlReader = XMLReaderFactory.createXMLReader();
      InputSource inputSource = new InputSource(new StringReader(inputText));
      xmlReader.setContentHandler(new StripContentHandler(xmlReader));
      xmlReader.parse();
      return xmlReader.getXMLReader().getLexicalHandler().getDomNode().getStringValue();
   }
}

class StripContentHandler implements ContentHandler {
   private XMLReader xmlReader;

   public StripContentHandler(XMLReader xmlReader) {
      this.xmlReader = xmlReader;
   }

   public void startDocument() throws SAXException {
      xmlReader.getLexicalHandler().startDocument();
   }

   public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
      xmlReader.getLexicalHandler().startElement(uri, localName, qName, atts);
   }

   public void characters(char[] ch, int start, int length) throws SAXException {
      xmlReader.getLocator().setCharacterStream(new StringReader(new String(ch, start, length)));
      xmlReader.getLexicalHandler().characters();
   }

   public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
      xmlReader.getLocator().setCharacterStream(new StringReader(new String(ch, start, length)));
      xmlReader.getLexicalHandler().ignorableWhitespace();
   }

   public void endElement(String uri, String localName, String qName) throws SAXException {
      boolean hasInvalidChars = false;
      String chars = xmlReader.getLexicalHandler().endElement(uri, localName, qName);
      for (int i = 0; i< chars.length(); i++) {
         char c = chars.charAt(i);
         if (!Character.isLetterOrDigit(c)
              || c == ':' || c == '.' || c == ',' || c == '='
              || (c >= '0' && c <= '9') && c != ']' && c != ']'
              || c >= '\u0080' && !Character.isISOControl(c)) {
            hasInvalidChars = true;
            break;
         }
      }
      if (hasInvalidChars) {
         xmlReader.getLocator().setCharacterStream(new StringReader(new String(chars).replaceAll("[^A-Za-z0-9:.,=]", ""))).findCharacterEncoding();
         xmlReader.setContentHandler(new StripContentHandler(xmlReader));
         xmlReader.parse();
         return;
      }
      xmlReader.getLexicalHandler().endElement(uri, localName, qName);
   }

   public void endDocument() throws SAXException {
      xmlReader.getLexicalHandler().endDocument();
   }
}

上面代码使用Java的XML解析器来剥离无效字符。其中,StripContentHandler是一个实现了ContentHandler接口的类,它可以处理XML解析的事件,例如文本的开始、结点、空格、注释等。在处理结点时,我们遍历字符节点,检查它是否是一个有效的字符(不是字母、数字、冒号、点、等于号、方括号或ISO控制字符),如果无效,则重置解析器并重新解析文档。

如果解析后的文本中有未剥离有效的XML字符,则可以根据需要重复使用StripContentHandler类进行多次迭代解析。最终获得的字符串是无效字符被剥离后的文本。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深入剖析Java反射,由浅入深,层层剥离

写在开头 之前更新了不少Java基础知识,比如Java类、对象、基础类型、关键字、序列化、泛型、值传递等等,今天要上点深度了,来聊一聊Java 反射 !...使用场景 反射被称之为框架灵魂,Java中被大量使用在框架、动态代理、注解等场景下; 开发框架:Spring、SpringBoot、Mybatis、Hibernate等框架中使用了反射 动态代理:面向切面编程...Class也是一个类,存放在java.lang包,它作用是:编译时生成一个类Class对象,这个对象包含了类结构信息,如类名、继承父类、实现接口、方法、属性等等,Class对象保存在编译后...包中常用反射类java.lang.reflect包存着几个反射常用类,大概罗列如下,注意,Class类其实是放在java.lang。...2、性能开销:由于反射涉及到动态解析,因此无法执行 Java 虚拟机优化,再加上反射写法的确要复杂得多,所以性能要比“正射”差很多,一些性能敏感程序应该避免使用反射。

7000

XML SQLServer使用

当你用XML数据类型配置这些对象一个时,你指定类型名字就像你SQLServer 中指定一个类型一样。 XML数据类型确保了你XML数据被完好构建保存,同时也符合ISO标准。...,当我声明变量时候,只需要包含XML数据类型名字变量名后。...Listing16,我指定了[1]Xquery表达式后面,所以结果集将只返回第一个人名字。...除了表达式定义你XQuery表达式,你也能聚合功能来进一步定义你查询和操作数据。...总结 我们基本上了解了XMLSQLServer 简单应用,从定义到使用方法。也看到了query()检索子集,也能使用value()检索独立元素属性值。

5.8K30

XML SQLServer使用

当你用XML数据类型配置这些对象一个时,你指定类型名字就像你SQLServer 中指定一个类型一样。 XML数据类型确保了你XML数据被完好构建保存,同时也符合ISO标准。...,当我声明变量时候,只需要包含XML数据类型名字变量名后。...Listing16,我指定了[1]Xquery表达式后面,所以结果集将只返回第一个人名字。...除了表达式定义你XQuery表达式,你也能聚合功能来进一步定义你查询和操作数据。...总结 我们基本上了解了XMLSQLServer 简单应用,从定义到使用方法。也看到了query()检索子集,也能使用value()检索独立元素属性值。

7.7K70

解决安卓XML文件声明高度 宽度无效问题

xml version="1.0" encoding="utf-8"?...但是添加到ListView时候,却发现在手机上显示高度明显大于45dp。 image 根据图片我们可以看到,下面三个按钮显示高度跟第一个显示高度,差了差不多两倍多高度。...原来原因在这里: 我们是使用 inflater.inflate(R.layout.item_popumenu, root, attachToRoot); 来添加到父布局,但是对于这几个参数却没有去研究...如果root不为null,attachToRoot设为true,则会给加载布局文件指定一个父布局,即root。 3....不设置attachToRoot参数情况下,如果root不为null,attachToRoot参数默认为true。 其实也看得我云里雾里,但是大概知道解决方法了。

2K30

在请求目标中找到无效字符。有效字符RFC 7230和RFC 3986定义

背景:   今天使用Tomcat8部署完成项目做测试时候,发现有的接口会报错400,后端提示在请求目标中找到无效字符。有效字符RFC 7230和RFC 3986定义 ?...原因分析:   是因为 日志显示请求地址包含不合法字符,出现400错误   tomcat高版本严格按照RFC 3986规范解析地址。该规范只允许包含  a-zA-Z  0-9  -  _    ....  ~  以及所有保留字符  ! * ’ ( ) ; : @ & = + $ , / ?...# [ ]     但是项目发起请求参数中出现{},所以需要配置一下 解决方案:   tomcat配置文件做出以下配置,找到tomcat配置server.xml路径就在config文件夹下...relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%" 加上红色框代码  问题解决。

14K31

JavaXML处理和解析

XML是一种非常流行标记语言,用于存储和表示数据。Java应用程序XML处理和解析技术已经成为了一种非常常见标准方式。 下面将针对JavaXML处理和解析技术进行详细介绍。...2、JavaXML读写操作 Java,我们可以使用DOM或SAX方式来实现XML文件读写操作。...3、JavaXML校验 Java提供了DTD(Document Type Definition)和Schema两种方式来校验XML文件有效性。...4、JavaXML转换 Java还提供了一系列工具实现XML格式和其他格式相互转换,如将XML格式文档转为PDF或HTML等。...5、JavaXML解析 Java,我们可以使用一组流程化API对XML数据进行解析,这组API就是JAXP(Java API for XML Processing)。

14410

Java字符串是通过引用传递

这是一个经典java问题。stackoverflow上,许多类似的问题已经被问过了,但是许多回答是错误或不完整。 如果你不想深入思考的话,这个问题很简单。...x 存储了堆"ab"字符引用。...因此,当x作为参数传递到change()方法时候,它仍然堆"ab",如下所示: ? 因为java是按值传递,x值是"ab"引用。...当字符串"cd" 被创建时,java会分配储存字符串所需要内存量。然后,对象被分配给了变量x,实际上是将对象引用分配给了变量x。这个引用是对象储存内存地址。...变量x包含了一个指向字符串对象引用,x并不是字符串对象本身。它是一个储存了字符串对象'ab'引用变量。 java是按值传递

6.2K50

Java字符

零、前言 1.字符流只能操作文本 2.本质底层依然是使用字节操作,只不过坐了一层封装 3.字符流是由Java虚拟机将字节转化为2个字节Unicode字符为单位字符而成,对多国语言支持性比较好...fileWriter = new FileWriter(fileName); //2.写入数据 fileWriter.write("Line1 第一行\r\n"); //3.刷新流缓冲...FileWriter.png ---- 2.字符流之FileReader使用 注:为了简单起见,将FileWriter.txtLine2 第二行删除 public class Client...@qq.com * 说明:将 I:\Java\Base\Thinking\src\IOTest\Activity.md * 拷贝到 F:\javaTest\IO 文件夹 */ public...-9 Java字符流 V0.2--无 - - 2.更多关于我 笔名 QQ 微信 爱好 张风捷特烈 1981462002 zdl1994328 语言 我github 我简书 我CSDN 个人网站

91620

用好JAVA函数式接口,轻松从通用代码框架剥离掉业务定制逻辑

今天我们一起聊一聊JAVA函数式接口。那我们首先要知道啥是函数式接口、它和JAVA普通接口有啥区别?...函数式接口JDK大放异彩 JDK源码 java.util.function包下面提供一系列预置函数式接口定义: 部分使用场景比较多函数式接口功能描述归纳如下: 直接执行一段处理函数,无任何输出参数...那按照常规思路,我们要将定制逻辑从公共逻辑剥离,会定义一个接口类型,要求不同资源实体类都继承此接口类,实现接口类calculatePirce方法,这样平台通用计算逻辑时候,就可以通过泛型接口调用方式来实现我们目的...,能不能我们不要求所有资源都去实现指定接口类,也能将定制逻辑从平台逻辑剥离呢?...函数式接口具体使用场景,如果结合Lambda表达式,可以使得编码更加简洁、不拖沓。 我们都知道,JAVA接口类是不能直接使用,必须要有对应实现类,然后使用具体实现类。

47730

字符删除特定字符

首先我们考虑如何在字符删除一个字符。由于字符内存分配方式是连续分配。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个字节位置。...具体实现,我们可以定义两个指针(pFast和pSlow),初始时候都指向第一字符起始位置。当pFast指向字符是需要删除字符,则pFast直接跳过,指向下一个字符。...这样,前面被pFast跳过字符相当于被删除了。用这种方法,整个删除O(n)时间内就可以完成。 接下来我们考虑如何在一个字符查找一个字符。当然,最简单办法就是从头到尾扫描整个字符串。...我们可以新建一个大小为256数组,把所有元素都初始化为0。然后对于字符每一个字符,把它ASCII码映射成索引,把数组该索引对应元素设为1。...这个时候,要查找一个字符就变得很快了:根据这个字符ASCII码,在数组对应下标找到该元素,如果为0,表示字符没有该字符,否则字符包含该字符。此时,查找一个字符时间复杂度是O(1)。

8.9K90

Spring,applicationContext.xml 配置文件web.xml配置详解

大家好,又见面了,我是你们朋友全栈君。 一、首先写一下代码结构。 二、再看web.xml配置情况。 <?xml version="1.0" encoding="UTF-8"?..." xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0...如果applicationContext.xml配置文件存放在src目录下,就好比上面的代码结构存放位置,那么web.xml配置就如下所示: .../param-value> 如果applicationContext.xml配置文件存放在WEB-INF下面,那么web.xml配置就如下所示:... 配置文件启动时,加载是web-info目录下applicationContext.xml, 运行时使用是web-info/classes目录下applicationContext.xml

1.7K20

java字符和流

字节 用于计量存储容量一种计量单位,通常情况下一字节等于八位, 也表示一些计算机编程语言中数据类型和语言字符。...计算机,我们知道,所有的一切都是归根到底都是二进制字节形式,包括文件,字符串等等。所以写程序时候,尝尝需要和字节打交道。...例如:我们需要把一个字符串写入到文本文件,我们就需要借助字节这个中间单位来进行处理。...流是一个字节转移介质,如同用吸管喝水,水是字节集合文件,吸管就是流。 输入流:顾名思义,就是从外界到程序介质。 输出流:对外界进行输出介质 java 中常用输入流和输出流: ?...字符流 什么是字符流?用什么用? 还是用喝水来说,我们怎么获得吸管里面水属性?我们比如获得吸管某一段水重量怎么获得? 字符流是流一种工具,是能够获得流单个字节单位工具。

77620

Java字符

字符串 判断相等方法String.equals() Java判等是有讲究,往往直接使用==得出答案可能是正确也可能是错误,看这段示例: 1 String s1="a"; 2 String...还有以下几点需要注意地方: Java,内容相同字串常量(“a”)只保存一份以节约内存,所以s1,s2实际上引用是同一个对象。... str,int fromIndex)   返回子串str第一个字符字符位置fromIndex后出现第一个和最后一个位置。...为要提取最后一个字符源串位置,字符数组buf[]存放目的字符串,dstbegin 为提取字符目的串起始位置。...5、修改字符串 修改字符目的是为了得到新字符串,有关各个方法使用,参考java API。

1.5K00
领券