问题
I want to do schema validation using an XSD file. When I import the XSD file to Eclipse, without running the validation class, I have the following error:
src-resolve: Cannot resolve the name 'ds:Signature' to an 'element declaration' component
I am kinda new to XML vs XSD validation process. Although I have looked for similar questions on google, I couldn't figure out what's wrong here.
The XSD file is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xerces="http://xerces.apache.org"
xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:abc="http://abc.123.com" targetNamespace="http://abc.123.com"
xmlns:xades141="http://uri.etsi.org/01903/v1.4.1#" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:import namespace="http://uri.etsi.org/01903/v1.3.2#" schemaLocation="XAdES.xsd"/>
<xs:import namespace="http://uri.etsi.org/01903/v1.4.1#" schemaLocation="XAdESv141.xsd"/>
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
<xs:complexType name="headerType">
<xs:sequence>
<xs:element name="doorNumber" type="xs:int"/>
<xs:element ref="ds:Signature"/>
</xs:sequence>
</xs:complexType>
How should I modify the XSD to fix this error?
回答1:
If you have xmldsig-core-schema.xsd
in the same directory as your XSD, and if it is the same as this XSD, then you should not be getting an error about a failure to resolve ds:Signature
.
Therefore, I suspect that your import is failing, and you're missing or ignoring a warning such as the following:
[Warning] try.xsd:9:56: schema_reference.4: Failed to read schema document 'xmldsig-core-schema.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not
<xsd:schema>
.
Try this XSD as a test; it loads directly from the URL for xmldsig-core-schema.xsd
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:abc="http://abc.123.com"
targetNamespace="http://abc.123.com"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
<xs:complexType name="headerType">
<xs:sequence>
<xs:element name="doorNumber" type="xs:int"/>
<xs:element ref="ds:Signature"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
I've tested the above XSD and found that it eliminates the resolution error that you were seeing.
回答2:
As an alternative you can cache locally the xmldsig-core-schema.xsd
, put it in the same directory of your xsd schema, an then let your original
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
This will resolve your problem of importing a file from W3C website and save time of execution.
回答3:
I just generated XSD files from cXML DTD files using Visual Studio 2019 and ran into the same problem.
In my case solution contained multiple steps:
- Save digital signature schema file
xmldsig-core-schema.xsd
(downloadable from https://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd) in the same folder as you cXML schema files - Search for & replace all the occurrences of
xmlns:ds="uri:ds"
withxmlns:ds="http://www.w3.org/2000/09/xmldsig#"
- Find & delete all the occurances of
<xs:import namespace="uri:ds" />
After these steps cXML schema files validated and I was able to generate C# classes using command:
xsd /c cXML.xsd xmldsig-core-schema.xsd
Note: xsd
tool requires both schemas to be passed in.
来源:https://stackoverflow.com/questions/30924686/src-resolve-cannot-resolve-the-name-dssignature-to-an-element-declaration