问题
I tried validating my XML file with a XSD file but I get the following error message:
[Error]: cvc-complex-type.2.3: Element 'paragraph' cannot have character [children], because the type's content type is element-only
Which (if i am understanding it correctly) means a complex type cannot have a combination of simple and complex typed elements as children.
But how do I fix this? I'm still kinda new to this, so the solution could be simple?
My code is shown below:
XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="biography">
<xs:complexType>
<xs:sequence>
<xs:element name="paragraph" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name">
<xs:complexType>
<xs:sequence>
<xs:element name="first_name" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="last_name" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="emphasize" maxOccurs="unbounded" minOccurs="0" type="xs:string"></xs:element>
<xs:element name="profession" maxOccurs="unbounded" minOccurs="0" type="xs:string"></xs:element>
<xs:element name="date" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="month" type="xs:string"></xs:element>
<xs:element name="day" type="xs:int"></xs:element>
<xs:element name="year" type="xs:int"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="definition" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="term" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML:
<biography>
<paragraph>
<name><first_name>Alex</first_name> <last_name>Turing</last_name></name>
was one of the first people to truly deserve the name <emphasize>computer
scientist</emphasize>. Although his contributions to the fields are too
numerous to lst, his best-known are the famous <emphasize>Turing
Test</emphasize> and <emphasize>Turing Machine</emphasize>.
</paragraph>
<definition>The <term>Turing Test</term> is to this day the standard test
for determining whether a computer is truly intelligent. This test yet
has to be passed.</definition>
<definition>A <term>Turing Machine</term> is an abstract finite state
automaton with infinite memory that can be proven equivalent to any other
finite state automaton with arbitrarily large memory. Thus what is true
for one Turing machine is true for all Turing machines no matter how
implemented.</definition>
<paragraph>
<name><last_name>Turing</last_name></name> was also an accomplished
<profession>mathematician</profession> and
<profession>cryptographer</profession>. His assistance was crucial in
helping the Allies decode the German Enigma cipher. He committed suicide
on <date><month>June</month> <day>7</day>, <year>1954</year></date>
after being convicted of homosexuality and forced to take female hormone
injections.
</paragraph>
</biography>
回答1:
This is precisely the purpose of mixed content:
<xs:element name="paragraph" maxOccurs="unbounded">
<xs:complexType mixed="true">
And:
<xs:element name="definition" maxOccurs="unbounded">
<xs:complexType mixed="true">
Note that you also probably want paragraph
and definition
to be in a xs:choice macOccurs="unbounded"
given your XML.
Here's your XSD updated with all changes needed so that your XML will be valid:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="biography">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="paragraph">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="name">
<xs:complexType>
<xs:sequence>
<xs:element name="first_name" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="last_name" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="emphasize" maxOccurs="unbounded" minOccurs="0" type="xs:string"></xs:element>
<xs:element name="profession" maxOccurs="unbounded" minOccurs="0" type="xs:string"></xs:element>
<xs:element name="date" minOccurs="0">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="month" type="xs:string"></xs:element>
<xs:element name="day" type="xs:int"></xs:element>
<xs:element name="year" type="xs:int"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="definition">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="term" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
回答2:
For me This error happen because of the strange character in the xml When I compared two files with similar data in "BeyondCompare" tool I found unknown character which is not visible. Open faulty file in "Visual Studio Code" it showed me some special characters.
When I copy pasted the string in online tools to find special characters, I found that is a special character ().
Because of this character, I got above error. It took two weeks to find solution.
来源:https://stackoverflow.com/questions/34493270/element-cannot-have-character-children-because-the-types-content-type-is-ele