当前位置: 首页 > 编程语言 > C#

XMLSchema-ListAllowedAttributes-TagsbyLocationinXMLShare

时间:2023-04-10 18:47:55 C#

XMLSchema-ListAllowedAttributes/TagsbyLocationinXML可用标签/属性列表?所以说我的光标在and上,而我的模式只允许那里的元素,我可以在C#中做些什么来解决这个问题吗?办法是有的,但是XmlSchema规范比较复杂,需要费点功夫,几百行代码。.NETXmlSchemaValidator类的GetExpectedParticles方法是解决方案的关键部分。这使用作为参数传递的XmlSchemaSet返回一组XmlSchemaObject实例。在调用该方法之前,需要先构造一个到光标所在位置的节点路径,其中必须包含祖先元素及其前一个兄弟元素,以及当前嵌套层级的上一个兄弟元素。此节点路径用于设置模式验证器的上下文。调用GetExpectedParticles后,您需要处理粒子。例如,检查每个预期粒子是否是替换组的成员,并检查预期粒子是否是枚举的受限简单类型。最好将获取预期元素和属性的代码分开。以下不完整的片段包含GetExpectedParticles方法调用,它仅适用于元素标记内容,不适用于属性:名称表nt=new名称表();XmlNamespaceManager管理器=newXmlNamespaceManager(nt);XmlSchemaValidator验证器=newXmlSchemaValidator(nt,schemaSet,manager,XmlSchemaValidationFlags.None);//事件处理程序设置validationErrorFound本地字段validator.ValidationEventHandler+=newValidationEventHandler(validator_ValidationEventHandler);验证器.Initialize();XmlSchemaInfoxsInfo=newXmlSchemaInfo();诠释我=0;foreach(nodePath中的nodeDescriptornameUri){validator.ValidateElement(nameUri.LocalName,nameUri.NamespaceUri,xsInfo);if((i>=siblingPosition&&siblingPosition>-1)||nameUri.Closed){validator.SkipToEndElement(null);}else{validator.ValidateEndOfAttributes(null);我++;XmlSchemaParticle[]parts=validator.GetExpectedParticles();f(parts.Length==0){boolhasElements=true;boolelementClosed=nodePath[nodePath.Count-1].Closed;if(elementClosed)//我们在元素标签之外{hasElements=true;}elseif(xsInfo.SchemaTypeisXmlSchemaSimpleType){hasElements=false;}else{XmlSchemaComplexTypexsCt=xsInfo.SchemaTypeasXmlSchemaComplexType;XmlSchemaContentTypexsContent=(XmlSchemaContentType)xsCt.ContentType;如果(xsContent==XmlSchemaContentType.TextOnly){hasElements=false;}}if(!hasElements){expectedType=XmlEditor.expectedListType.elementValue;如果(xsInfo.SchemaElement!=null){elementNames.Add(xsInfo.SchemaElement);}}返回元素名称;}foreach(XmlSchemaObjectxsoinparts){if(xsoisXmlSchemaElement){XmlSchemaElementxse=(XmlSchemaElement)xso;如果(subGroupList.ContainsKey(xse.QualifiedName)){列表xses=subGroupList[xse.QualifiedName];foreach(xses中的XmlSchemaElementxseInstance){elementNames.Add(xseInstance);}}else{elementNames.Add(xse);}}elseif(xsoisXmlSchemaAny){XmlSchemaAnyxsa=(XmlSchemaAny)xso;foreach(XmlSchemaxsinschemaSet.Schemas()){if(xs.TargetNamespace==xsa.Namespace){foreach(XmlSchemaElementxseAnyinxs.Elements){elementNames.Add(xseAny);}}}}}}以下(不完整的)片段显示了如何从粒子中获取预期的枚举值:privateListExpectedEnumValues(XmlSchemaObjectxsso){XmlSchemaSimpleTypexst=null;XmlSchemaComplexTypexsCt=null;列表值=newList();如果(xsso==null){返回值;}if(xssoisXmlSchemaAttribute){XmlSchemaAttributexsa=(XSchemaAttribute)xsso;xst}else{XmlSchemaElementxse=(XmlSchemaElement)xsso;XmlSchemaTypegxst=xse.ElementSchemaType;if(gxstisXmlSchemaSimpleType){xst=(XmlSchemaSimpleType)gxst;}elseif(gxstisXmlSchemamlXTypeComplexType){xsCt=)gxst;}else{返回值;}}if(xst!=null){if(xst.TypeCode==XmlTypeCode.Boolean){值es.Add("真");值。添加(“假”);}else{ProcessXmlSimpleType(xst,值);}}elseif(xsCt!=null){XmlSchemaContentTypexsContent=(XmlSchemaContentType)xsCt.ContentType;XmlSchemaContentModelxsModel=(XmlSchemaContentModel)xsCt.ContentModel;if(xsModelisXmlSchemaSimpleContent){XmlSchemaSimpleContentxsSC=(XmlSchemaSimpleContent)xsModel;XmlSchemaContentxsRE=xsSC.Content;if(xsRE!=null){if(xsREisXmlSchemaSimpleContentRestriction){XmlSchemaSimpleContentRestrictionxsCCR=(XmlSchemaSimpleContentRestriction)xsRE;foreach(xsCCR.Facets中的XmlSchemaObjectxso){如果(xso是XmlSchemaEnumerationFacet){XmlSchemaEnumerationFacetxsef=(XmlSchemaEnumerationFacet)xso;值.Add(xsef.Value);}}}}}else{XmlSchemaComplexContentxsCC=(XmlSchemaComplexContent)xsModel;XmlSchemaContentxsRE=xsCC.Content;if(xsRE!=null){if(xsRE是XmlSchemaComplexContentRestriction){XmlSchemaComplexContentRestrictionxsR=(XmlSchemaComplexContentRestriction)xsRE;}elseif(xsREisXmlSchemaComplexContentExtension){XmlSchemaComplexContentExtensionxsE=(XmlSchemaComplexContentExtension)xsRE;}}}}返回值;}并处理一个简单的类型:privatestaticvoidProcessXmlSimpleType(XmlSchemaSimpleTypexst,Listvalues){if(xst==null){return;XmlSchemaSimpleTypeContentxsstc=xst.Content;if(xsstcisXmlSchemaSimpleTypeRestriction){XmlSchemaSimpleTypeRestrictionxsr=(XmlSchemaSimpleTypeRestriction)xsstc;XmlSchemaObjectCollectionxsoc=xsr.Facets;XmlSchemaSimpleTypebastTypeOfRestiction=xsr.BaseType;foreach(XmlSchemaObjectxsoinxsoc){if(xsoisXmlSchemaEnumerationFacet){XmlSchemaEnumerationFacetxsef=(XmlSchemaEnumerationFacet)xso;值.Add(xsef.Value);}}}elseif(xsstcisXmlSchemaSimpleTypeList){XmlSchemaSimpleTypeListxsstL=(XmlSchemaSimpleTypeList)xsstc;XmlSchemaSimpleTypexstL=xsstL.BaseItemType;ProcessXmlSimpleType(xstL,val使用);//递归}elseif(xsstcisXmlSchemaSimpleTypeUnion){XmlSchemaSimpleTypeUnionxstU=(XmlSchemaSimpleTypeUnion)xsstc;XmlSchemaSimpleType[]xsstArray=xstU.BaseMemberTypes;}}}上面的代码片段可能解决了您所需内容的20%,但希望能让您了解将要处理的内容。NET提供了一组非常强大的类来分析模式对象模型,但您需要详细了解XML模式规范的知识才能获得可用的结果。当XML无效时,XML编辑器仍应提供自动完成帮助,这给问题增加了一个额外的维度,因为如果验证上下文有限并且模式设计更像“俄罗斯娃娃”而不是“意大利腊肠切片”,则可能会出现歧义。摘要使用.NET获取XML实例中给定上下文的预期XML架构粒子列表是可能的,但相对复杂。鉴于此,值得首先检查现有.NETXML编辑器中的库是否提供了所需的功能。对于LGPL下的工作实现,请查看SharpDevelopsXmlEditor部分。您可以在一个dll中获取xml的代码完成,即AddIns/DisplayBindings目录中的XmlEditor.dll。以上就是C#学习教程:XMLSchema-列出XML位置允许的属性/标签,分享所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: