标签: xsd-validation

如何使用key/keyrefs为相同类型的嵌套元素创建xml架构

我定期使用一些XML文件,并希望DTD可以提供更好的验证.所以我开始阅读有关模式的内容,看看是否会帮助我.到目前为止,我已经能够创造出几乎像我需要的东西,除了一件.我希望能够将元素的属性限制为具有相同元素类型的兄弟或祖先元素的不同属性的值.使用XML Schema密钥/ keyref限制是否可以实现这一点?

我有一个看起来像这样的文档:

<nodeContainer>
    <node name="Table">
    </node>

    <node name="MyHouse">
        <node name="RoomWithDoor">
        </node>
        <node name="DiningRoom" extends="RoomWithDoor">
            <node name="DiningTable" extends="Table">
            </node>
        </node>
    </node>

    <node name="MySummerHouse">
        <node name="DiningRoom">
            <node name="DiningTable" extends="Table">
            </node>
        </node>
    </node>
</nodeContainer>
Run Code Online (Sandbox Code Playgroud)

在本文档中,节点可以"扩展"以下其他节点:

  • 兄弟姐妹
  • 父母的兄弟姐妹

但是,节点不应"扩展":

  • 父母
  • 父母兄弟姐妹的子节点

这意味着MyHouse可以"扩展" ,这是没有意义的,但我没关系.

同样重要的是,两个房屋节点都应该能够拥有自己的名为DiningRoom的节点.

我目前的架构与此类似:

<xs:complexType name="node">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="node"/> <!-- node can have other nodes inside it -->
        <xs:element ref="leaf"/>
    </xs:choice>
    <xs:attribute name="name"       type="xs:anySimpleType" use="required"/>
    <xs:attribute name="extends"    type="xs:anySimpleType"/>
</xs:complexType>

<!-- document root -->
<xs:element …
Run Code Online (Sandbox Code Playgroud)

xml schema xsd keyref xsd-validation

6
推荐指数
1
解决办法
1965
查看次数

XML 模式来验证 XML 模式?

有谁知道是否可以使用另一个 XML 模式验证 XML 模式?如果是这样,是否有参考实现?我想使用 JAXB 解析架构文档。

xml xsd jaxb xsd-validation

6
推荐指数
1
解决办法
1738
查看次数

应用程序上下文中Spring Bean模式的验证错误

在设置一个新的基于Spring的应用程序之后,我在应用程序上下文中遇到了引用模式(http://www.springframework.org/schema/beans/spring-beans-3.0.xsd)的问题.

appContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

 ....

</beans:beans>
Run Code Online (Sandbox Code Playgroud)

错误

Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-3.0.xsd).
Run Code Online (Sandbox Code Playgroud)

即使我将配置减少到最小版本(没有任何bean定义),我也会收到此错误.有没有人暗示这里有什么问题?提前致谢!

顺便说一句:我正在使用STS 2.7.1

spring xsd-validation

6
推荐指数
2
解决办法
2万
查看次数

同步XML模式验证?.NET 3.5

我知道我可以使用如下所示的回调方法对模式验证xml,但有没有一种方法可以同步而不是事件驱动?

我想到的一种方法是设置一个类成员布尔标志IsValidated = false然后
调用xml.Validate(ValidationEventHandler).一旦完成,事件处理程序将设置IsValidated = true.同时,执行循环检查,直到标志设置为true然后继续.

这是针对.Net 3.5的.

    public bool ValidateSchema(string xmlPath, string xsdPath)
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(xmlPath);

        xml.Schemas.Add(null, xsdPath);

        xml.Validate(ValidationEventHandler); 
    }
Run Code Online (Sandbox Code Playgroud)

好的,我已经完成了测试,看起来xml.validate实际上等待,直到回执完成才执行新代码.

在下面的示例中,MessageBox.Show("After Validate"); 总是在执行myValidationEventHandler之后发生.

我还通过代码来验证这一点.

所以我想这使我的问题成为一个问题.

// load etc.
...

xmlValidate(myValidationEventHandler);

MessageBox.Show("After Validate");


    private void myValidationEventHandler(object sender, ValidationEventArgs e)
    {
        for (double i = 0; i < 100000; i++)
        {
            textBox1.Text = i.ToString();
            Application.DoEvents();
        }

    // do stuff with e
    }
Run Code Online (Sandbox Code Playgroud)

c# xml xsd xsd-validation

6
推荐指数
2
解决办法
3669
查看次数

如何实例化抽象类型的XSD元素

我是一名刚接触XML和Web服务的java程序员.我正在尝试创建一个符合XSD(我没写过)的xml文档,其中包含下面的代码片段.我想要做的是调用此Web服务来复制邮件.有一个名为copy的元素,它是抽象类型"tns:CopyRequest".由于元素的类型是抽象的,Eclipse告诉我我不能创建一个.有一个CopyMailingRequest类型(听起来就像我想要的那样),但我不确定如何实例化它,因为没有扩展该类型的元素.我错过了什么?

<xs:element name="copy" nillable="true" type="tns:CopyRequest"/>

<xs:complexType name="CopyMailingRequest">
  <xs:complexContent>
    <xs:extension base="tns:CopyRequest">
      <xs:sequence>
        <xs:element name="fromId" type="tns:MailingId"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="StandardMailingId">
  <xs:complexContent>
    <xs:extension base="tns:MailingId"/>
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="MailingId">
  <xs:complexContent>
    <xs:extension base="tns:ObjectId"/>
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="CopyRequest" abstract="true">
  <xs:sequence>
    <xs:element name="newName" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

xml xsd xsd-validation

6
推荐指数
1
解决办法
2万
查看次数

如何在XSD中添加条件验证:

现有的XSD代码段:

<xs:element name="searchcriteria">
   <xs:complexType>
     <xs:sequence>  
       <xs:element ref="filter" 
                   minOccurs="0" 
                   maxOccurs="unbounded" />
     </xs:sequence>
     <xs:attribute name="Request" 
                   type="RequestType" />
   </xs:complexType>
 </xs:element>  


<xs:element name="filter">
   <xs:complexType>
     <xs:sequence>
       <xs:element ref="filter" 
                   minOccurs="0" 
                   maxOccurs="unbounded" />
     </xs:sequence>
     <xs:attribute name="FieldName" 
                   type="FieldNameType" />
    </xs:complexType>
 </xs:element>
Run Code Online (Sandbox Code Playgroud)

...

  • RequestType:枚举2个值R1和R2

  • FieldNameType:2个值F1和F2的枚举

现在我想修改此XSD以提供以下验证:

  1. 当RequestType = R1时,则Alowed Fields名称为F1和F2
  2. 当Request Type = R2时,允许的字段名称为F1,F3和F4.(可能需要新的枚举)

我该如何添加此类验证?谢谢.

xsd-validation

6
推荐指数
1
解决办法
1万
查看次数

在XML Schema 1.0中是否有<assert>的替代方法

我在下面有一个XSD文档片段.当XML文件针对此模式进行验证时,我希望确保该值中的值mm:Depotmm:Customer/mm:County相同并限制为该Location类型中的项.

这可以使用<assert>标记在XML Schema 1.1中完成,但我必须针对XML Schema 1.0进行验证.是否有一些巧妙的技巧使这项工作在1.0?

<xsd:element name="DeliveryOrder" type="OrderDetails" />

<xsd:complexType name="OrderDetails">
    <xsd:sequence>
        <xsd:element name="Depot" type="mm:Location" />
        <xsd:element name="Customer" type="mm:Customer" maxOccurs="1" minOccurs="1" />
    </xsd:sequence> 
</xsd:complexType>

<xsd:simpleType name="Location">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="OverHere" />
        <xsd:enumeration value="OverThere" />
    </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="Customer">   
    <xsd:sequence>
        <xsd:element name="firstname" type="string" />
        <xsd:element name="surname" type="string" />
        <xsd:element name="County" type="mm:Location" />
    </xsd:sequence>
</xsd:complexType>
Run Code Online (Sandbox Code Playgroud)

我想要实现的是这样的......

<?xml version="1.0" encoding="UTF-8"?>
<mm:DeliveryOrder xmlns:mm="http://myNamespace/DeliveryOrderSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://myNamespace/DeliveryOrderSchema DeliveryOrder.xsd ">

  <mm:Depot>OverThere</mm:Depot>
  <mm:Customer>
    <mm:firstname>Jane</mm:firstname>
    <mm:surname>Doe</mm:surname>
    <mm:County>OverThere</mm:County>
  </mm:Customer>
</mm:DeliveryOrder>
Run Code Online (Sandbox Code Playgroud)

请注意,该值 …

xml xsd assert xsd-validation xsd-1.0

6
推荐指数
1
解决办法
4404
查看次数

XDocument.Validate - 错误元素的预期数据类型

我有一个类,它根据提供的XSD验证提供的XML文档.在类中,我调用该XDocument.Validate方法来执行验证,并收到以下错误:

' http://www.example.com/enrollrequest1:requested-payment-date '元素无效 - 根据数据类型' http:// www,值'2015-05-28T00:00:00'无效. w3.org/2001/XMLSchema:date ' - 字符串'2015-05-28T00:00:00'不是有效的XsdDateTime值.

元素的值已经从.NET DateTime变量设置,最终将其设置为包含时间部分,因为在.NET中没有等效的xs:date类型.

元素的值是从通用模块设置的,因此我无法选择元素并自定义设置它们的值.开发人员向我发送.NET DateTime类型的值,我的程序又调用该XElemet.SetValue(value)方法来设置它.

此外,XSD文件是我无法控制的.因此,修改XSD不是一种选择.

有没有办法知道导致错误的XElement的预期类型是什么?一旦我知道了,我就可以相应地对我的代码进行类型转换或自定义.因此,例如在这种情况下,如果我知道预期的类型是xs:date(而不是xs:datetime),我可以简单地对输入值进行类型转换.

这是我的验证器类,如果这有帮助:

Option Strict On
Imports System.XML.Schema

Public Class XmlSchemaValidator
    Public ReadOnly Errors As New List(Of String)

    Private XDoc As XDocument
    Private Schemas As XmlSchemaSet

    Public Sub New(ByVal doc As XDocument, ByVal schemaUri As String, ByVal targetNamespace As String)
        Me.XDoc = doc
        Me.Schemas = New XmlSchemaSet
        Me.Schemas.Add(targetNamespace, schemaUri)
    End Sub

    Public …
Run Code Online (Sandbox Code Playgroud)

.net xml datetime date xsd-validation

6
推荐指数
1
解决办法
593
查看次数

.net核心中的XSD/Schema验证解决方法?

我从https://github.com/dotnet/corefx/issues/3633获得,现在尚不支持XSD架构验证,并计划在.Net Core 1.2.0其发布日期为2017年春季.

然而,这是我们产品的关键功能之一,因此它必须得到支持.现在.Net标准甚至没有System.Xml.Schema我们想要暂时使用完整的.net核心,但没有帮助.

以前v1.2.0,是否有任何解决方法来执行xsd架构验证?

xsd-validation .net-core

6
推荐指数
1
解决办法
1466
查看次数

在 XSD 中嵌套来自不同命名空间的 XML 元素

假设我有一个命名空间元素的 XML 架构定义,我希望将其用作第二个命名空间中 XML 元素的子元素。

举个例子,假设我们有文件foo.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:foo-ns" targetNamespace="urn:foo-ns"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

  <xs:element name="foo" type="fooType"/>

  <xs:complexType name="fooType">
    <xs:attribute name="id" use="required"/>
  </xs:complexType>

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

以及文件bar.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:bar-ns"
           targetNamespace="urn:bar-ns"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:foo-ns="urn:foo-ns"
           elementFormDefault="qualified">

  <xs:import namespace="urn:foo-ns" schemaLocation="foo.xsd"/>

  <xs:element name="bar" type="barType"/>

  <xs:complexType name="barType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="foo" type="foo-ns:fooType"/>
    </xs:sequence>
    <xs:attribute name="name" use="required"/>
  </xs:complexType>

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

那么我期望以下文件bar.xml是有效的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<bar name="myBar" xmlns="urn:bar-ns">
  <foo id="myFoo" xmlns="urn:foo-ns"/>
</bar>
Run Code Online (Sandbox Code Playgroud)

然而,我的 XML 验证器抱怨 foo 元素的命名空间声明;相反,它坚持以下文件有效:

<?xml version="1.0" encoding="UTF-8"?> …
Run Code Online (Sandbox Code Playgroud)

xml xsd xml-namespaces xml-validation xsd-validation

6
推荐指数
1
解决办法
1479
查看次数