【问题标题】:Decimal value is coming as 0E-8 [closed]十进制值为 0E-8 [关闭]
【发布时间】:2020-10-26 11:54:00
【问题描述】:

我们在 java 1.8 和 web 逻辑 12c 中使用 XSD 验证 XML,但是我们面临 0E-8 不是十进制的有效值

下面是我的 XML:

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

<isns:Envelope xmlns:isns="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:pkp-core="http://tracx.de/pkp/interfaces/core/1.0"
               xmlns:pkp-msg="http://tracx.de/pkp/interfaces/msg/1.0">
   <isns:Header/>
   <isns:Body>
      <pkp-msg:ABC>
         <pkp-msg:test>
            <pkp-core:oops>
               <pkp-core:XYZ>0.00000000</pkp-core:XYZ>
               
             <pkp-core:billi>period</pkp-core:bill>
               <pkp-core:check>0.90225</pkp-core:check>
            </pkp-core:oops>
         </pkp-msg:test>
      </pkp-msg:ABC>
   </isns:Body>
</isns:Envelope>

一段java代码:

javax.xml.validation.Validator validator = schema.newValidator();

                validator.setErrorHandler(new EUBatchValidationHandler());

                validator.validate(source);

【问题讨论】:

  • 0.00000000 当由BigDecimal 解析时是一个数字0,其比例应为8,但BigDecimal 的toString() 方法将其输出为0E-8 ,这是有据可查的。您没有指定 为什么 该值被拒绝;是因为 zero 的值无效,还是因为该值不允许使用Scientific Notation?实际的 XML 模式 指定了什么?
  • 嗨@Andreas。在 XSD 中,我们有类似 的验证
  • 不要解释 XSD,展示它,在问题中。只需相关部分就足够了。
  • 仅供参考: 值 0.00000000 是一个有效的 xsd:decimal 值,所以要么你没有你认为你拥有的东西,要么 XSD 验证器被窃听。
  • 我们在 java 1.6 中使用了上面的验证方法,它工作正常,java 1.8 的问题。所以你可以建议任何替代方法

标签: java xml validation xsd weblogic12c


【解决方案1】:

无法复制
这不是答案,而是这样写的,因此可以包含Minimal, Reproducible Example。

以下代码已经过测试:

  • OpenJDK jdk1.7.0_75
  • Oracle jdk1.8.0_181
  • OpenJDK jdk-11.0.2
  • OpenJDK jdk-14

代码在所有 4 上产生相同的输出。

import java.io.StringReader;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class Test {
    public static void main(String[] args) throws Exception {
        String xml = "<ABC>\n" +
                     "  <XYZ>0.00000000</XYZ>\n" +
                     "</ABC>";
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
        Document document = domBuilder.parse(new InputSource(new StringReader(xml)));
        System.out.println("XYZ = " + document.getElementsByTagName("XYZ").item(0).getTextContent());
        
        String xsd = "<schema xmlns=\"http://www.w3.org/2001/XMLSchema\">\n" + 
                     "  <element name=\"ABC\">\n" + 
                     "    <complexType>\n" + 
                     "      <sequence>\n" + 
                     "        <element name=\"XYZ\" type=\"decimal\" />\n" + 
                     "      </sequence>\n" + 
                     "    </complexType>\n" + 
                     "  </element>\n" + 
                     "</schema>";
        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = schemaFactory.newSchema(new StreamSource(new StringReader(xsd)));
        Validator validator = schema.newValidator();
        validator.validate(new DOMSource(document));
        System.out.println("Validation successful");
    }
}

输出

XYZ = 0.00000000
Validation successful

【讨论】:

  • 非常感谢它清除了我所有的疑虑@Andreas
猜你喜欢
  • 2014-09-04
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2018-01-05
相关资源
最近更新 更多