Свойство XML требуется в зависимости от значения атрибута родительского свойства в WSDL [duplicate]

Кажется, есть много вопросов об этой проблеме с java.util.Scanner. Я думаю, что более читаемым / идиоматическим решением было бы вызвать scanner.skip("[\r\n]+"), чтобы удалить любые символы новой строки после вызова nextInt().

ИЗМЕНИТЬ: как показано ниже, как @PatrickParker, это вызовет бесконечный цикл, если пользовательские входы любые пробелы после номера. См. Их ответ на лучший шаблон для использования с пропуском: https://stackoverflow.com/a/42471816/143585

1
задан Krishna 3 June 2015 в 10:33
поделиться

1 ответ

Обновление: OP отредактировал вопрос, чтобы удалить использование xs:assert и заявил в комментариях, что валидация должна иметь место на C #. Ответ на вопрос OP теперь становится следующим:

Вы не можете принудительно применять ограничение, которое изменяет необходимость элемента на основе значения атрибута с использованием XSD 1.0, а Microsoft не поддерживает XSD 1.1, поэтому вы должны либо отключить ваши ограничения или проверить их вне вашего XSD.


Оригинальный ответ XSD 1.1

(Сохранен для будущих читателей)

Вы близки, но ваше утверждение

      <xs:assert test="count(./PackageArg[@type eq 'Batch']) eq 1"/>

проверяет @type на PackageArg, когда оно должно проверяться на @Type на Application.

Следующий XSD проверит ваш XML и выполнит ваши зависимые от атрибута требования:

XSD 1.1

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           vc:minVersion="1.1">
  <xs:element name="Applications">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Application" maxOccurs="unbounded" minOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element type="xs:string" name="ProjectDirName"/>
              <xs:element type="xs:string" name="Project" minOccurs="0"/>
              <xs:element type="xs:string" name="Version" minOccurs="0"/>
              <xs:element type="xs:string" name="PackageArg" minOccurs="0"/>
              <xs:element type="xs:string" name="OutputDirName"/>
            </xs:all>
            <xs:attribute type="xs:string" name="Name" use="optional"/>
            <xs:attribute name="Type" use="required">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:enumeration value="Web"/>
                  <xs:enumeration value="Batch"/>
                  <xs:enumeration value="Service"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
            <xs:assert test="PackageArg or @Type != 'Batch'"/>
            <xs:assert test="Version or @Type != 'Service'"/>
            <xs:assert test="Project or not(@Type = 'Web' or @Type = 'Service')"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Имейте в виду, что Microsoft не поддерживает XSD 1.1. (Вы отметили свой вопрос «msxml»).

2
ответ дан kjhughes 27 August 2018 в 19:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: