我正在try 解析一个包含十六进制值𝓅的XML.这表示数学符号?.我得到的输出是��.

我做错了什么?

示例输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <data>&#x1d4c5;</data>
</root>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <data>&#55349;&#56517;</data>
</root>

获取XML读取器的代码:

factory = org.apache.xerces.jaxp.SAXParserFactoryImpl.newInstance();
final XMLReader xmlReader;
        xmlReader = factory.newSAXParser().getXMLReader();

我正在使用UTF-8编码在解析时进行解码.

我用来读写XML的代码是这个方法:

public void readAndWriteXml(InputSource inputSource, OutputStream out) throws IOException, SAXException, ParserConfigurationException {

            XMLReader xmlReader = getXmlReader();
            Serializer serializer = SerializerFactory.getSerializer(configProps);
            serializer.setOutputStream(out);
            xmlReader.setContentHandler(serializer.asContentHandler());

            if(logger != null){
                getLogger().debug("starting xml parsing" + LocalTime.now());
            }
            xmlReader.parse(inputSource);
            if(logger != null){
                getLogger().debug("end xml parsing" + LocalTime.now());
            }

        }

GetXMLReader()如下所示:

final XMLReader xmlReader;
        xmlReader = factory.newSAXParser().getXMLReader();
        xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
        xmlReader.setFeature("http://xml.org/sax/features" +
                "/namespaces", true);
        xmlReader.setFeature("http://xml.org/sax/features/external-parameter-entities", true);
//        xmlReader.setFeature("http://xml.org/sax/features/validation", true);
        xmlReader.setEntityResolver(wrappedEntityResolver);
        xmlReader.setErrorHandler(new SaxErrorHandler());
        return xmlReader;

以下是我对类进行初始化的过程:

public XmlNormalizer(String catalogPath) throws IOException {
        // We want the Apache XML parser, not the embedded Oracle Java version.
        factory = org.apache.xerces.jaxp.SAXParserFactoryImpl.newInstance();
        factory.setNamespaceAware(true);
        List<Path> catalogFiles = this.findByFileName(new File(catalogPath).toPath(), CATALOG_FILENAME_PATTERN);
        String[] catalogArray = catalogFiles.stream().map(Path::toString).toArray(String[]::new);
        configProps = OutputPropertiesFactory.getDefaultMethodProperties("xml");
        XMLCatalogResolver xmlCatalogResolver = new XMLCatalogResolver(catalogArray, true);
        wrappedEntityResolver = new WrappedEntityResolver(xmlCatalogResolver);
    }

WrapedEntityResolver只是import org.apache.xerces.util.XMLCatalogResolver;左右的包装器

推荐答案

这一结果肯定是错误的,但很难说出原因.

传递给序列化程序的属性是什么?

如果使用Saxon进行序列化,则使用默认编码(UTF-8)时,输出为

<?xml version="1.0" encoding="UTF-8"?><root>
   <data>?</data>
</root>

而使用ENCODING=us-ascii时,输出为:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <data>&#x1d4c5;</data>
</root>

Java相关问答推荐

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

无法找到符号错误—Java—封装

如何在访问完所有文件后加入所有线程?

springboot start loge change

使用联接和分页的SpringBoot Spring数据JPA

JVM会优化这个数学运算吗?

编译多个.Java文件并运行一个依赖于用户参数的文件

JavaFX如何在MeshView中修复多个立方体?

按属性值从流中筛选出重复项

OpenGL ES 3.0-纹理黑色

Javadoc在方法摘要中省略方法

如何在太阳系模拟器中添加月球?

是否在settings.xml中使用条件Maven镜像?

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

深度优先搜索实现:算法只向右搜索

Java 21中泛型的不兼容更改

视图被推出线性布局-Android

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

在Java中比较同一多维数组的两个不同的字符串元素

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)