Java DOM Element,如何找到 Element 值的实际数据类型?截至目前,一切都被视为字符串
Posted
技术标签:
【中文标题】Java DOM Element,如何找到 Element 值的实际数据类型?截至目前,一切都被视为字符串【英文标题】:Java DOM Element, How to find the actual data type of the Element values? As of now everything considered as String 【发布时间】:2021-11-11 03:55:26 【问题描述】:我的标准 XML 中有一个自定义的用户定义部分。像这样的:
<rail:JourneyDate>2014-12-12</rail:JourneyDate>
<rail:Name>Rajadhani</rail:Name>
<rail:AxelCount>12</rail:AxelCount>
<rail:VehicleCount>true</rail:VehicleCount>
<rail:PassangerCount>20.5</rail:PassangerCount>
这部分 XML 完全是用户定义的,可以是任何东西。我正在使用 JAXB 阅读它,一切正常。
问题在于Dom Element
中的所有值都被视为String
,但正如我们在上面的XML 中看到的那样,值可以是不同的数据类型,例如Date
、Integer
、Float
、Boolean
、String
等
但是,当我使用 element.getTextContent()
读取每个元素的值时,此函数总是返回 String
。有没有办法每次都找到每个Element
而不是String
的实际数据类型?
【问题讨论】:
如果没有为这些字段定义 XSD 模式,则 JAXB 无法猜测它们真正的类型(字符串是标准猜测,因为所有内容都可以是字符串)。您要么定义一个模式(因此 JAXB 将能够相应地解析它们),要么您必须将它们作为字符串获取并按照一些逻辑自行解析它们。 @MatteoNNZ 感谢您的回复。甚至我也打算编写自己的自定义类来查找这些元素的数据类型。在 XSD 中,它们将是any
类型的一部分,因为它们是完全用户定义的,因此出现了混淆。如果还有其他方法,请告诉我,否则我将为这种情况编写自己的自定义类。
我认为您可以定义自己的 XmlAdapter 并用它注释您的自定义 XML 字段。对于编组和解组,您将在此类上由 JAXB 调用,因此您应该能够以某种方式控制流程。但是,您仍然需要自己进行类型检查和解析。
存在(潜在的)模式感知对象模型,例如用于模式感知 XPath 2、XSLT 2 或 XQuery 1 及更高版本的 XDM。因此,与 Saxon EE 等模式感知 XPath 或 XSLT/XQuery 处理器结合使用时,您可以构建树并导航和选择类型节点值。
【参考方案1】:
我创建了类来确定类型:
public class ExtensionsDatatypeFinder
private ExtensionsDatatypeFinder()
//Method to check the datatype for user extension, ILMD, Error extensions
public static Object dataTypeFinder(String textContent)
if (textContent.equalsIgnoreCase("true") || textContent.equalsIgnoreCase("false"))
//Check if the Element Text content is of Boolean type
return Boolean.parseBoolean(textContent);
else if (NumberUtils.isParsable(textContent))
//Check if the Element Text content is Number type if so determine the Int or Float
return textContent.contains(".") ? Float.parseFloat(textContent) : Integer.parseInt(textContent);
else
return textContent;
然后绕过所需的数据调用它:
//Check for the datatype of the Element
final Object simpleFieldValue = ExtensionsDatatypeFinder.dataTypeFinder((String) extension.getValue());
//Based on the type of Element value write the value into the JSON accordingly
if (simpleFieldValue instanceof Boolean)
gen.writeBooleanField(extension.getKey(), (Boolean) simpleFieldValue);
else if (simpleFieldValue instanceof Integer)
gen.writeNumberField(extension.getKey(), (Integer) simpleFieldValue);
else if (simpleFieldValue instanceof Float)
gen.writeNumberField(extension.getKey(), (Float) simpleFieldValue);
else
//If instance is String directly add it to the JSON
gen.writeStringField(extension.getKey(), (String) extension.getValue());
【讨论】:
以上是关于Java DOM Element,如何找到 Element 值的实际数据类型?截至目前,一切都被视为字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在 java 中将 org.w3c.dom.Element 输出为字符串格式?