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 中看到的那样,值可以是不同的数据类型,例如DateIntegerFloatBooleanString

但是,当我使用 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 输出为字符串格式?

为元素设置焦点隐藏选中元素

jQuery筛选--find(expr|obj|ele)和siblings([expr])

在Vue框架中引入Element

克隆DOM元素 ele.cloneNode();

java基础 xml 使用dom4j解析 xml文件 servlet根据pattern 找到class