XSD недопустимый контент был найден пространством имен в элементе - PullRequest
0 голосов
/ 11 октября 2019

Я хочу проверить подписанный XML-файл на соответствие схеме XSD. Проблема заключается в том, что элемент XML подписи содержит атрибут пространства имен, а пространство имен не распознается схемой XSD. Так что я всегда получаю эту ошибку во время проверки:

<"org.xml.sax.SAXParseException; lineNumber: 2867; columnNumber: 55; cvc-complex-type.2.4.a: Invalid content was found starting with element '{"http://www.w3.org/2000/09/xmldsig#":Signature}'. One of '{Signature}' is expected.

Вот мой раздел XML xml, который я хочу проанализировать:

    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">      
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1"/>
            <Reference URI="">
                <Transforms>
                    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                </Transforms>
                <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <DigestValue>HNSlwP/h00NyO01CLexn+gbYxahOgjFfUKGJG3ggSMU=</DigestValue>
            </Reference>
        </SignedInfo><SignatureValue>EaLbG4wvdELbRw1uIou01WlJAX+J233aTUZI5c0yELkIjfBeV+XNbQ==</SignatureValue>
        <KeyInfo>
            <KeyValue>
                <DSAKeyValue><P>/KaCzo4Syrom78z3EQ5SbbB4sF7ey80etKII864WF64B81uRpH5t9jQTxeEu0ImbzRMqzVDZkVG9&#13;
xD7nN1kuFw==</P>
                    <Q>li7dzDacuo67Jg7mtqEm2TRuOMU=</Q><G>Z4Rxsnqc9E7pGknFFH2xqaryRPBaQ01khpMdLRQnG541Awtx/XPaF5Bpsy4pNWMOHCBiNU0Nogps&#13;
QW5QvnlMpA==</G>
<Y>7c2FbHxE5zTY6PkKQfHDdgGySWNSKYQ+j9nnD6FjwialpVuy6AKAbV8kdOYD3MMOMTJD8+N0+ZO9&#13;
Ofx6Nh6UIw==</Y>
                </DSAKeyValue>
            </KeyValue>
        </KeyInfo>       
    </Signature>

Здесь объявите позицию в моем XML со следующимtag:

      <xs:element ref="Signature"/>

А вот мое определение элемента подписи:

  <xs:element name="Signature" type="SignatureType"/>
  <xs:complexType name="SignatureType">
    <xs:sequence>
      <xs:any namespace="http://www.w3.org/2000/09/xmldsig#"
        minOccurs="0" maxOccurs="unbounded"/>
      <xs:element ref="SignedInfo"/>
      <xs:element ref="SignatureValue"/>
      <xs:element ref="KeyInfo" minOccurs="0"/>
      <xs:element ref="Object" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="Id" type="xs:ID"/>
  </xs:complexType>```

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

@ Michaek Kay Да, хорошая идея. Поэтому я импортировал файл:

  <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"/>

, а также объявил "dsig" в качестве пространства имен для типа подписи:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
  elementFormDefault="qualified"
>

И добавил пространство имен в свой элемент подписи:

      <xs:element ref="dsig:Signature"/>

Но теперь элемент не может быть найден: <"org.xml.sax.SAXParseException; lineNumber: 51; columnNumber: 41; src-resolve: Cannot resolve the name 'dsig:Signature' to a(n) 'element declaration' component.

Я также скачал этот файл xsd и поместил его в тот же каталог, где находится мой xsd. Если я щелкну элемент «dsig: Signature» в моей среде разработки, файл откроется, и элемент Signature станет видимым. Поэтому я думаю, что файл может быть доступен.

0 голосов
/ 11 октября 2019

Поскольку элемент Signature находится в своем собственном пространстве имен http://www.w3.org/2000/09/xmldsig#, его необходимо объявить в документе схемы, в котором это целевое пространство имен.

Похоже, такой документ схемы уже существует: см. https://www.w3.org/TR/xmldsig-core1/#sec-xsdSchema, поэтому все, что вам нужно сделать, это импортировать его с помощью xs:import, а не пытаться переопределить его самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...