为什么我的xml文件被检测为有效的xml?

时间:2016-04-06 14:57:49

标签: c# xml xsd

我想为MS office Docx的[Content_Types] .xml文件(Where can I find the XSDs of DOCX XML files?)找到一个xsd文件 我得到了答案,但我发现由于某种原因,这个xsd会导致我的所有xml文件都通过验证测试

这是我的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<Export_toLab Sending_Site="3">
  <Tracker Tracker_ID="55" Booklet_Type="3">
    <Booklet Booklet_ID="542"/>
  </Tracker>
</Export_toLab>

这是xsd文件(MS office Docx的[Content_Types] .xml的架构):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="http://schemas.openxmlformats.org/package/2006/content-types"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://schemas.openxmlformats.org/package/2006/content-types"
  elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all">
    <xs:element name="Types" type="CT_Types"/>
    <xs:element name="Default" type="CT_Default"/>
    <xs:element name="Override" type="CT_Override"/>
    <xs:complexType name="CT_Types">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element ref="Default"/>
            <xs:element ref="Override"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="CT_Default">
        <xs:attribute name="Extension" type="ST_Extension" use="required"/>
        <xs:attribute name="ContentType" type="ST_ContentType" use="required"/>
    </xs:complexType>
    <xs:complexType name="CT_Override">
        <xs:attribute name="ContentType" type="ST_ContentType" use="required"/>
        <xs:attribute name="PartName" type="xs:anyURI" use="required"/>
    </xs:complexType>
    <xs:simpleType name="ST_ContentType">
        <xs:restriction base="xs:string">
            <xs:pattern
        value="(((([\p{IsBasicLatin}-[\p{Cc}&#127;\(\)&lt;&gt;@,;:\\&quot;/\[\]\?=\{\}\s\t]])+))/((([\p{IsBasicLatin}-[\p{Cc}&#127;\(\)&lt;&gt;@,;:\\&quot;/\[\]\?=\{\}\s\t]])+))((\s+)*;(\s+)*(((([\p{IsBasicLatin}-[\p{Cc}&#127;\(\)&lt;&gt;@,;:\\&quot;/\[\]\?=\{\}\s\t]])+))=((([\p{IsBasicLatin}-[\p{Cc}&#127;\(\)&lt;&gt;@,;:\\&quot;/\[\]\?=\{\}\s\t]])+)|(&quot;(([\p{IsLatin-1Supplement}\p{IsBasicLatin}-[\p{Cc}&#127;&quot;\n\r]]|(\s+))|(\\[\p{IsBasicLatin}]))*&quot;))))*)"
      />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="ST_Extension">
        <xs:restriction base="xs:string">
            <xs:pattern
        value="([!$&amp;'\(\)\*\+,:=]|(%[0-9a-fA-F][0-9a-fA-F])|[:@]|[a-zA-Z0-9\-_~])+"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

这是验证码:

XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("http://schemas.openxmlformats.org/package/2006/content-types", "opc-contentTypes.xsd");

XDocument doc = XDocument.Load("MyFile.xml");
string msg = "";
doc.Validate(schemas, (o, e) => {msg += e.Message + Environment.NewLine;});
Console.WriteLine(msg == "" ? "Document is valid" : "Document invalid: " + msg);

为什么将xml文件视为有效的xml?

由于

1 个答案:

答案 0 :(得分:0)

我认为您可能遇到与此相同的问题:

XDocument.Validate is always successful

总而言之,validate方法不会为它不知道的节点引发错误。您应该在验证xml的名称空间与模式相同之前进行检查 - 如果不是,它肯定是失败的,因此无需验证。