문제

XSD 기능에 대한 또 하나의 도전,

내 클라이언트가 XML 파일을 보내고 있는데, 이는 0 개 이상의 정의되지 않은 또는 [호출] 예기치 않은 태그 (계층 구조에 나타날 수 있음)를 갖게됩니다. 글쎄 그들은 나에게 중복 태그입니다. 그래서 나는 그들의 존재를 무시해야하지만 그들과 함께 검증 해야하는 몇 가지 태그 세트가 있습니다.

이것은 샘플 XML입니다.

<root>
  <undefined_1>one</undefined_1>
  <undefined_2>two</undefined_2>
  <node>to_be_validated</node>
  <undefined_3>two</undefined_3>
  <undefined_4>two</undefined_4>
</root>

그리고 내가 시도한 XSD는 다음과 같습니다.

  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType

XSD는 특정 이유로 인해이를 허용하지 않습니다.
위에서 언급 한 예는 단지 샘플입니다. 실용적인 XML은 XML 태그의 복잡한 계층 구조와 함께 제공됩니다.

해킹을받을 수 있는지 알려주세요.

그건 그렇고, 대체 솔루션은 검증 프로세스 전에 XSL 변환을 삽입하는 것입니다. 글쎄, 나는 유효성 검사 프로세스를 트리거하는 .NET 코드를 변경해야하기 때문에 피하고 있습니다.이 회사는 최소한 회사에서 지원합니다.

도움이 되었습니까?

해결책 2

결론:

이것은 XSD에서는 불가능합니다. 요구 사항을 달성하려는 모든 접근 방식은 많은 오류와 함께 검증 된 툴에 의해 "모호한"으로 명명되었습니다.

다른 팁

아직이 작업을 수행하지 않은 경우 다음을 시도 할 수 있습니다.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Linux에서 이것은 libxml 버전 20706을 사용하여 xmllint와 잘 작동합니다.

어쩌면 네임 스페이스를 사용할 수 있습니다.

<xs:element name="root" type="root"></xs:element> 
  <xs:complexType name="root"> 
    <xs:sequence> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns1.com" /> 
      <xs:element name="node" type="xs:string"/> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns2.com"/> 
    </xs:sequence> 
  </xs:complexType>

이것은 아마도 검증 될 것입니다.

나는 같은 문제에 직면했다.

.NET에서 유효성 검사를 불렀기 때문에; 특정 검증 오류를 억제하기로 결정했습니다 ValidationEventHandler 해결 방법으로. 그것은 나를 위해 일했다.

    private void ValidationEventHandler(object sender, ValidationEventArgs e)
    {
        switch (e.Severity)
        {
            case XmlSeverityType.Warning:
                // Processing warnings
                break;
            case XmlSeverityType.Error:
                if (IgnoreUnknownTags
                    && e.Exception is XmlSchemaValidationException
                    && new Regex(
                        @"The element '.*' has invalid child element '.*'\."
                        + @" List of possible elements expected:'.*'\.")
                       .IsMatch(e.Exception.Message))
                {
                    return;
                }
                // Processing errors
                break;
            default:
                throw new InvalidEnumArgumentException("Severity should be one of the valid values");
        }
    }

중요합니다 Thread.CurrentUICulture 영어로 설정해야합니다 CultureInfo.InvariantCulture 이것이 작동하려는 현재 스레드의 경우.

XML 1.1에서 "Open Content"라는 새로운 기능을 사용할 수 있습니다. 요컨대, 추가적인 "알 수없는"요소가 다양한 위치에서 복잡한 유형에 추가 할 수 있고 파서가 해당 요소 중 하나에 도달하면해야 할 일을 지정할 수 있습니다.

XML 1.1을 사용하면 복잡한 유형이 다음과 같습니다.

<xs:element name="root" type="root" />
<xs:complexType name="root"> 
  <xs:openContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:openContent>

  <xs:sequence> 
    <xs:element name="node" type="xs:string"/> 
  </xs:sequence> 
</xs:complexType>

복잡한 유형이 많으면 스키마 상단에서 "기본"열기 콘텐츠 모드를 설정할 수도 있습니다.

<xs:schema ...>
  <xs:defaultOpenContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:defaultOpenContent>

  ...
</xs:schema>

열린 컨텐츠 용 W3C 사양은 다음에서 찾을 수 있습니다. http://www.w3.org/tr/xmlschema11-1/#oc 그리고 이것에 대한 좋은 글이 있습니다 http://www.ibm.com/developerworks/library/x-xml11pt3/#n102ba.

불행히도 .NET은 XML 1.1을 지원하지 않지만 무료 XML 1.1 프로세서를 찾을 수는 없지만 몇 가지 유료 옵션은 다음과 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top