【问题标题】:Problem validating XML with XSD facet pattern使用 XSD 构面模式验证 XML 时出现问题
【发布时间】:2021-02-08 20:35:21
【问题描述】:

我正在尝试使用 xmllint 针对 XSD 验证我的 XML 字符串,但我不断收到此错误:

file_0.xml:6: element No: Schemas validation error : Element '{http://www.mrq.gouv.qc.ca/T5}No': [facet 'pattern'] 值 'NP666666' 是不被模式 '(NP|np)d{6}' 接受。"

"file_0.xml:6: element No: Schemas validation error : Element '{http://www.mrq.gouv.qc.ca/T5}No': 'NP666666' 不是本地的有效值原子类型。

我实际上得到了 34 个错误,但它们都是一样的。除数字外,其他所有部分都通过了。 我的代码在 JavaScript 上,我正在手工制作要传递给 XML 的对象。

XML:

    <P><Annee>2019</Annee>
<TypeEnvoi>1</TypeEnvoi>

<Preparateur><No>NP999999</No>
<Nom1>Garderie Papillons</Nom1>

<Adresse><Ligne1>5 Street name</Ligne1>
<Ville>Toronto</Ville>
<Province>QC</Province>
<CodePostal>G5T6R4</CodePostal>
</Adresse>
</Preparateur>
<NoCertification>RQ-19-99-999</NoCertification>
<NomLogiciel>NomLogiciel</NomLogiciel>
<CourrielResponsable>CourrielResponsable</CourrielResponsable>
<IdPartenaireReleves>1234567891234567</IdPartenaireReleves>
<IdProduitReleves>1234567891234567</IdProduitReleves>

</P>

XSD:

 <xsd:element
name="P"
type="PStruct" />
<xsd:complexType
name="PStruct">
    <xsd:sequence>
        <xsd:element
    name="Annee"
    type="AnImpositionType">
            
        </xsd:element>
        <xsd:element
    name="TypeEnvoi"
    type="Indicateur1-4-6Type">
            
        </xsd:element>
        <xsd:element
    name="Preparateur">
            
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element
          name="No">
                        
                        <xsd:simpleType>
                            <xsd:restriction
              base="xsd:string">
                                <xsd:pattern
                value="(NP|np)\d{6}" />
                            </xsd:restriction>
                        </xsd:simpleType>
                    </xsd:element>
                    <xsd:element
          name="Type"
          type="Indicateur1-3Type"
          minOccurs="0">
                        
                    </xsd:element>
                    <xsd:element
          name="Nom1"
          type="Char30Type">
                        
                    </xsd:element>
                    <xsd:element
          name="Nom2"
          type="Char30Type"
          minOccurs="0">
                        
                    </xsd:element>
                    <xsd:element
          name="Adresse"
          type="Adresse2Struct"
          minOccurs="0" />
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
        <xsd:element
    name="Informatique"
    type="RessourceStruct"
    minOccurs="0">
            
        </xsd:element>
        <xsd:element
    name="Comptabilite"
    type="RessourceStruct"
    minOccurs="0">
            
        </xsd:element>
        <xsd:element
    name="NoCertification">
            
            <xsd:simpleType>
                <xsd:restriction
        base="xsd:string">
                    <xsd:pattern
          value="RQ-\d{2}-\w{2}-\w{3}" />
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
        <xsd:element
    name="NomLogiciel"
    type="Char40Type"
    minOccurs="0">
            
        </xsd:element>
        <xsd:element
    name="VersionLogiciel"
    type="Char15Type"
    minOccurs="0">
            
        </xsd:element>
        <xsd:element
    name="CourrielResponsable"
    type="Char60Type"
    minOccurs="0">
            
        </xsd:element>
        <xsd:element
    name="CourrielLangue"
    type="LangueType"
    minOccurs="0">
            
        </xsd:element>
        <xsd:element
    name="IdPartenaireReleves"
    type="Char16FixeType">
            
        </xsd:element>
        <xsd:element
    name="IdProduitReleves"
    type="Char16FixeType">
            
        </xsd:element>
        <xsd:element
    name="NoCasEssai"
    type="Char25Type"
    minOccurs="0">
            
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>

【问题讨论】:

  • 您能否发布一个最小但完整的 XSD 而不是以name="P" 开头的格式错误的片段?

标签: xml xsd xsd-validation xml-validation xmllint


【解决方案1】:

(NP|np)d{6} 匹配 NPddddddnpdddddd

您可能指的是(NP|np)\d{6},它会匹配数字而不是文字d 字母。


更新基于 cmets 中的交换:
XSD 似乎被作为字符串处理,因此 \d{6} 在用于验证之前被解释为仅转义为 d{6}

【讨论】:

  • 在 XSD 中它位于 \d{6} 它只是没有出现在错误中
  • 这就是发布 XML、XSD 等 (minimal reproducible example) 很重要的原因之一。我看到您现在添加了 XSD 的片段,但它从开始元素标记的中间开始。请发布格式良好、完整的 XSD。谢谢。
  • 我已经测试了你关于 NPdddddd 的理论,是的,由于某种原因它没有看到 \,所以它适用于 6ds
  • 如果 XSD 或其部分在某处被作为字符串处理,则原始的 \d 在用于验证之前可能会被解释和替换为文字 d
  • 是的,我想我只是通过放置两个反斜杠来修复它。我对其他人也这样做,让你知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2015-04-20
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多