gpt4 book ai didi

xml - Jackson/Woodstox XML 编码字符解释

转载 作者:行者123 更新时间:2023-12-04 17:55:56 28 4
gpt4 key购买 nike

我收到了一个 XML 文件,其中包含使用 Jackson 和 Woodstox 阅读、编辑和编写它的说明(根据文档中的建议)。在大多数情况下,这并不太难。他们都非常擅长它的作用。不过,此时我遇到了一个问题:

我的 XML 对象本身包含 XML 对象。例如:

<XMLObject>
<OuterObject attributeOne="1" attributeTwo="2" attributeThree="&gt;">
<InnerObject>&lt;NestedObject&gt;Blah&lt;/NestedObject&gt;</InnerObject>
</OuterObject>
<OuterObject attributeOne="11" attributeTwo="22" attributeThree="&lt;">
<InnerObject>&lt;NestedObject&gt;Blah&lt;/NestedObject&gt;</InnerObject>
</OuterObject>
<OuterObject attributeOne="111" attributeTwo="222" attributeThree="3" />
<XMLObject>

当我将 XML 文件读入我的 Jackson 注释的 Java 对象时,&lt; 的所有这些实例和 &gt;由 Woodstox 转换为 <> , 分别。当我将对象写回 XML 文件时,<变成 &lt;但是>留下来>

<XMLObject>
<OuterObject attributeOne="1" attributeTwo="2" attributeThree=">">
<InnerObject>&lt;NestedObject>Blah&lt;/NestedObject></InnerObject>
</OuterObject>
<OuterObject attributeOne="11" attributeTwo="22" attributeThree="&lt;">
<InnerObject>&lt;NestedObject>Blah&lt;/NestedObject></InnerObject>
</OuterObject>
<OuterObject attributeOne="111" attributeTwo="222" attributeThree="3" />
<XMLObject>

我尝试读取文件的方法的最简单版本如下:

@RequestMapping("readXML")
public @ResponseBody CustomXMLObject readXML() throws Exception {
File inputFile = new File(FILE_PATH);
XmlMapper mapper = new XmlMapper();
CustomXMLObject value = mapper.readValue(inputFile, CustomXMLObject .class);

return value;
}

对于我上面给出的示例,我的 Jackson 注释 Java 对象看起来像这样:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class CustomXMLObject {
@JacksonXmlProperty(isAttribute=true)
private long attributeOne;
@JacksonXmlProperty(isAttribute=true)
private String attributeTwo;
@JacksonXmlProperty(isAttribute=true)
private String attributeThree;
@JacksonXmlProperty(localName = "InnerObject")
private String innerObject;


public long getAttributeOne() {
return attributeOne;
}

public void setAttributeOne(long attributeOne) {
this.attributeOne = attributeOne;
}

public String getAttributeTwo() {
return attributeTwo;
}

public void setAttributeTwo(String attributeTwo) {
this.attributeTwo = attributeTwo;
}

public String getAttributeThree() {
return attributeThree;
}

public void setAttributeThree(String attributeThree) {
this.attributeThree = attributeThree;
}

public String getInnerObject() {
return innerObject;
}

public void setInnerObject(String innerObject) {
this.innerObject = innerObject;
}
}

最后,我的依赖项如下所示:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
</dependency>

这似乎是由于 Jackson 使用 Woodstox 的 BufferingXmlWriter 而发生的。这个特定的作者将拦截这些字符并对其进行编码,并且似乎没有任何方法可以规避该决定:

private final void writeAttrValue(String value, int len) throws IOException {
int inPtr = 0;
char qchar = this.mEncQuoteChar;
int highChar = this.mEncHighChar;

while(true) {
String ent = null;

while(true) {
if(inPtr >= len) {
return;
}

char c = value.charAt(inPtr++);
if(c <= 60) {
if(c < 32) {
if(c == 13) {
if(this.mEscapeCR) {
break;
}
} else {
if(c == 10 || c == 9 || this.mXml11 && c != 0) {
break;
}

c = this.handleInvalidChar(c);
}
} else {
if(c == qchar) {
ent = this.mEncQuoteEntity;
break;
}

if(c == 60) {
ent = "&lt;";
break;
}

if(c == 38) {
ent = "&amp;";
break;
}
}
} else if(c >= highChar) {
break;
}

if(this.mOutputPtr >= this.mOutputBufLen) {
this.flushBuffer();
}

this.mOutputBuffer[this.mOutputPtr++] = c;
}

if(ent != null) {
this.writeRaw(ent);
} else {
this.writeAsEntity(value.charAt(inPtr - 1));
}
}
}

所以最后总结一下问题,我得到了一个 XML 文件。该 XML 文件包含属性和元素,它们本身包含已编码(<>)的符号(&lt;&gt;),以免破坏 XML。当 Woodstox 读取文件时,它没有将 XML 中包含的实际字符串交给我的 Java 对象,而是对字符进行解码。写作时,只有<重新编码为 &lt; .这似乎是因为 jackson 正在使用 Woodstox 的 BufferingXmlWriter,它似乎无法配置以避免对这些字符进行编码。

因此,我的问题如下:

我能否将 Jackson 对象配置为使用 Woodstox XML 阅读器,这样我就可以在不进一步编码的情况下读取和写入 XML 文件中的字符,或者我是否需要研究完全不同的解决方案来满足我的需要?

最佳答案

您可以配置底层 XMLOutputFactory2 以使用 CharacterEscapes,它可以指定覆盖默认转义的内容。这会不会:

http://www.cowtowncoder.com/blog/archives/2012/08/entry_476.html

工作?

编辑:对上面的建议表示歉意——这不适用于 XML,仅适用于 JSON。我应该仔细检查一下。虽然有一个工作项可以使其也适用于 XML,但目前还不存在(截至 2016 年 11 月)。

关于xml - Jackson/Woodstox XML 编码字符解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40412978/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com