알 수없는 태그의 검증을 무시하는 방법은 무엇입니까?
-
18-09-2019 - |
문제
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 프로세서를 찾을 수는 없지만 몇 가지 유료 옵션은 다음과 같습니다.