返回首页

简介
本文展示了一个类包含从相应的XmlSchema信息的XmlDocument结合的一个节点的信息。
这些类是将要实施的对象:
实施
我们同时读取XML和XSD文件,并建立一个文件,其中将包含这两个文件的节点相结合的信息。
当我们需要从一个XmlDocument文件读取信息,我们使用类的System.Xml.XmlDocument。这个类不仅读取一个孤立的XML文件,但可以同时读取相应的XSD架构文件,申请在此过程中必要的验证。
当我们要拦截这个过程中,我们需要实现从System.Xml.XmlValidatingReader派生的类,并覆盖Read方法。这种方法是调用基类每次启动或停止阅读从XML文件中的一个节点。此时,基类已经包含了当前读取的节点,如信息:名称,价值,和信息已经从XSD文件中提取。不幸的是,它不包含我们的目标的关键信息,它不具有的属性,它返回当前读取的节点描述的System.Xml.Schema.XmlSchemaElement。
我们可以克服这一障碍?这些项目的文件:Puma.Xml.XmlValidatingReader.cs,Puma.Xml.XmlXsdNodeBuilder.cs。
测试,只需打开项目属性\输出类型\控制台应用程序。
全部工程静态模式:

使用代码Puma.Xml.XmlXsdDocument类
这个类创建一个XML树的表示。这棵树不仅包含了从XML的信息,但也从相应的XSD架构相关的信息。树表示XML和关联的XSD文件,使导航和编辑XML文档。此外,这个类提供了相应的XSD创建一个XML文件的方法。
的限制:
这个类可以处理与限制内容的唯一文件:例如,一个complexType元素可能只有一个序列孩子。
构造函数:
公共XmlXsdDocument(字符串XmlFileName,串XsdFileName)
加载XML和XSD文件从指定的文件
公共XmlXsdDocument(字符串XsdFileName)
符合XSD文件创建一个XML文件。
公共XmlXsdDocument(XmlFileName字符串,字符串XsdFileName,NodeExtensible NodeExtensible)
加载XML和XSD文件从指定的文件。当负载时,NodeExtensible类重写的方法将被调用。
公共XmlXsdDocument(字符串XsdFileName,NodeExtensible NodeExtensible)
符合XSD文件创建一个XML文件。在创建时的NodeExtensible类重写的方法将被调用。
公共XmlXsdDocument(字符串XsdFileName,ConstructParams ConstructParams,NodeExtensible NodeExtensible)
创建一个XML文件,符合XSD文件和ConstructParams参数。在创建时的NodeExtensible类重写的方法将被调用。
属性:
公共Puma.Xml.XmlDocument的XmlDocument
公共Puma.Xml.XsdDocument XsdDocument
方法:
公众无效保存(字符串文件名)
保存XML文档到指定的文件。
公众无效保存()
XML文档保存到文件中加载它。
公众无效SaveBin(字符串文件名)
保存XML文档到指定的二进制文件。
的限制:
每个元素的maxOccurs属性不能是无限的。一个字符串类型的每个元素必须具备的MaxLength限制。应该承认从文档中的任何元素的类型的SaveBin方法。
当前版本支持:字符串,字节,SByte,Int16的,的Int32,Int64的,UInt16的,UInt32的,的UInt64。
枚举限制的元素应该有一个非字符串基类型。Puma.Xml.ConstructParams类Puma.Xml.ConstructParams.ConstructElementParams类
属性:
BOOL UseMinOccurs = TRUE
当一个元素被创建时,文件的数量将等于minOccurs属性。否则,这将是平等的maxOccurs(在这种情况下的maxOccurs不应该有无限的价值)。Puma.Xml.ConstructParams.ConstructDefaultValueParams类
属性:
公共字符StringFillChar =""
当创建一个字符串类型的元素是具有minLength限制,该值初始化字符串长度等于minLength StringFillChar字符填充。
System.IO.BinaryReader ValueProvider
当创建一个XML文档是从XSD架构文件,这个参数不为空,所创建的XML的所有值将被从这个读者阅读数据进行初始化。
的限制:
见Puma.Xml.XmlXsdDocument.SaveBeen()的限制。Puma.Xml.NodeExtensible类
这个类有助于延长一个文件节点或文档本身的功能。当XmlXsdDocument创建一个节点树中的节点,我们可以调用这个类的方法之一,并使用返回的对象TagEx属性初始化节点。此外,我们可以轻松获得这种通过适当的节点TagEx属性返回的对象。
方法:
虚拟对象OnXmlNodeCreated(Puma.Xml.XmlNode的XmlNode)
时调用的文件已完成创建的XmlNode。
虚拟对象OnXsdNodeCreated(Puma.Xml.XsdNode XsdNode)
时调用的文件已经完成创建XsdNode。
虚拟对象OnXmlXsdNodeCreated(Puma.Xml.XmlXsdNode XmlXsdNode)
时调用的文件已经完成创建XmlXsdNode。
虚拟对象OnXmlDocumentCreated(Puma.Xml.XmlDocument的XmlDocument)
时调用的文件已完成创建的XmlDocument。
虚拟对象OnXsdDocumentCreated(Puma.Xml.XsdDocument XsdDocument)
时调用的文件已经完成创建XsdDocument。
虚拟对象OnXmlXsdDocumentCreated(Puma.Xml.XmlXsdDocument XmlXsdDocument)
时调用的文件已完成创建本身。Puma.Xml.XmlXsdNode类
类包含有关文档节点的信息。由于文档树的一部分是什么属性,从而获得一个孩子和家长,结合信息是从XML和XSD文件中提取。
属性:
Puma.Xml.XmlXsdDocument XmlXsdDocument
文件包含这个节点。
公共Puma.Xml.XmlNode的XmlNode
描述从XML文档中的节点。
公共Puma.Xml.XsdNode XsdNode
描述从XSD文件的节点。
对象的Parent
检索父(Puma.Xml.XmlXsdDocument或Puma.Xml.XmlXsdNode型)。
公共字符串名称
检索节点的名称。
公共BOOL IsComplexType
定义,如果该节点可能有子节点​​。
公共字符串值
检索节点的值。
公共对象TypedValue
检索节点类型的价值。
公共XmlXsdNodeCollection尔兹
检索的子节点的集合。Puma.Xml.XmlXsdNodeCollection类
表示节点的子节点的集合。每个集合被细分成若干片段[见XmlXsdNodeCollectionFragment类]。
方法:
公共XmlXsdNodeCollectionFragment GetXmlXsdNodeFragment(字符串FragName)
获取相关的片段集合。
属性:
公共XmlXsdNodeCollectionFragment这个字符串FragName] {}
获取相关的片段集合。Puma.Xml.XmlXsdNodeCollectionFragment类
类代表了一个具有相同名称的子节点集合。这使得将节点添加到从这个集合中删除节点的能力。
注意:一个节点可能包含具有相同名称的子节点的集合。这可能会导致当这个节点是描述的maxOccurs GT属性的XSD文件; 1,并且是在XML文档中遇到不止一次;所有这些节点将设在一个XmlXsdNodeCollectionFragment容器。的maxOccurs = 1的情况下,即使在单个节点将位于一个单独的XmlXsdNodeCollectionFragment容器。此外,一个节点可能的minOccurs = 0,而不是在XML文档中遇到的。在这种情况下,也将创建一个XmlXsdNodeCollectionFragment。
例如:一个XSD文件:LT; XS:元素的名称= quot; Rootquot; GT; LT; XS:complexTypegt; LT; XS:sequencegt; LT; XS:元素名称="Node1quot;类型= quot; XS:unsignedBytequot的maxOccurs = quot; 3quot; / GT; LT; XS:元素名称="Node2quot;类型= quot; XS:unsignedBytequot的maxOccurs = quot; 1quot; / GT; &# 160; LT; XS:元素名称="Node3quot;类型= quot; XS:unsignedBytequot的minOccurs = quot; 0quot; / GT; &# 160; LT; / XS:sequencegt; LT; / XS:complexTypegt;LT; / XS:elementgt;
XML文档:LT; Rootgt; LT; Node1gt; 1LT; / Node1gt; LT; Node1gt; 2LT; / Node1gt; LT; Node2gt; 3lt; / Node2gt;LT; / Rootgt; FOREACH(XmlXsdNodeCollectionFragment rootXmlXsdNode片段){ System.Console.WriteLine("破片名称:??frag.Name); FOREACH(XmlXsdNode孩子在片段) { System.Console.WriteLine("孩子的名字:child.Name??  60; "值="; child.Value"); }}
控制台:破片名称:Node1上孩子的名字:Node1上,VAL = 1孩子的名字:Node1上,VAL = 2FRAG名称:Node2上孩子的名字:Node2上,VAL = 3FRAG名称:节点3
属性:
公共XsdNode TemplateXsdNode
返回节点包含的信息,相关的XSD文件,从目前的片段节点。
公共XmlXsdNode [INT指数]
检索给定索引处的节点。
公共XmlXsdNode LastNode
检索最后一个节点。如果没有节点存在,则返回null。
公共BOOL IsCanInsert
定义一个节点可能被添加到的片段。
公共BOOL IsCanRemove
定义一个节点可以从片段中删除。
方法:
公共XmlXsdNode InsertXmlXsdNode(INT指数)
此方法创建基于信息TemplateXsdNode成员中的一个节点,并插入文档的节点。节点后插入片段具有相同的索引节点。如果指数= -1,节点被放置在片段结束。
的值是在这种方式初始化:如果这个节点存在一个默认值,它是应用。如果该值为字符串类型和minLength限制,这是初始化字符串的长度= minLength,字符ConstructDefaultValueParams.StringFillChar填充(见Puma.Xml.ConstructParams类)如果该值已枚举的限制,这是遇到的第一个枚举值初始化。如果该值是一个数据类型的值,并实现一个则为MinValue静态属性,它是由这个属性初始化。如果没有满足这些情况下,该值初始化为null。
注意事项:
使用时,创建一个复杂的节点,子节点元素的数量取决于ConstructElementParams.UseMinOccurs参数(见Puma.Xml.ConstructParams类)。如果该值为true,那么这个数目是相等的minOccurs;否则等于的maxOccurs。
例外:
Puma.Xml.XmlExceptions.ChildCollectionXmlException [ChildCollectionExceptionCode = Puma.Xml.XmlExceptions.ChildCollectionExceptionCode.NodeIndexInvalid]
发生时的一个片段的索引超出范围(指数片段中的元素的数量超过)。
Puma.Xml.XmlExceptions.ChildCollectionXmlException [ChildCollectionExceptionCode = Puma.Xml.XmlExceptions.ChildCollectionExceptionCode。 MaxOccursLimitExcited]
OOccurs没有节点时可以添加片段(节点的数量比的maxOccurs)。
例如:XSD文件:LT; XS:元素名称="; Rootquot; GT; LT; XS:complexTypegt; LT; XS:sequencegt;  60; LT; XS:元素名称="Node1quot;的minOccurs =??????/ SPAN> GT; LT; XS:complexTypegt;  0; LT; XS:sequencegt; & #160; LT; XS:元素的名称="; Node11quot; & #160; 类型="XS:???unsignedBytequot;默认= 00 / SPAN> / GT;   ; LT; XS:元素的名称="; Node12quot;   ; 键入="XS:unsignedBytequot的minOccurs =?????? GT; LT; XS:元素名称="Node13quot; GT; LT; XS:simpleTypegt; LT; XS:限制基地"XS:stringquot; GT;   ;LT; XS的MaxLength值="; 5quot / GT; &# 160; LT; / XS:restrictiongt; LT; / XS:simpleTypegt; LT; XS:元素名称="Enum1quot; PGE:P​​arentValuePart = quot; truequot; GT; LT; XS:simpleTypegt; LT; XS:限制基地"XS:unsignedBytequot; GT;   ; LT; XS:枚举值="; 2quot / GT; LT; XS:枚举值="; 3quot / GT; LT; XS:枚举值="; 8quot / GT; & #160; LT; / XS:restrictiongt; & #160; LT; / XS:simpleTypegt;  60; LT; / XS:elementgt;   ; LT; / XS:sequencegt; LT; / XS:complexTypegt; LT; / XS:elementgt; LT; / XS:sequencegt; LT; / XS:complexTypegt;LT; / XS:elementgt;
XML文档:LT; Rootgt;LT / Rootgt ;////////////////////////////////// /载入XML和Puma.Xml.XmlXsdDocument的XSD,LT; ROOTgt;节点Puma.Xml.XmlXsd.XmlXsdNodeCollectionFragment FRAG = rootXmlXsdNode ["; Node1quot;];/ /使用ConstructElementParams.UseMinOccurs = true和/ / ConstructDefaultValueParams.StringFillChar ='X'Puma.Xml.XmlXsd.XmlXsdNode insertedNode = frag.InsertXmlXsdNode(-1);FOREACH(中insertedNode insFrag XmlXsdNodeCollectionFragment){ System.Console.WriteLine("破片名称:??insFrag.Name); FOREACH(中insFrag XmlXsdNode孩子) { System.Console.WriteLine("孩子的名字:??  0; child.Name",VAL ="; child.Value"); }}
控制台:破片名称:Node11孩子的名字:Node1上,VAL = 100FRAG名称:Node12孩子的名字:Node12,VAL = 0孩子的名字:Node12,VAL = 0孩子的名字:Node12,VAL = 0FRAG名称:Node13孩子的名字:Node13,VAL = XXXXXFRAG名称:Enum1孩子的名字:Enum1,VAL = 2
公共XmlXsdNode RemoveXmlXsdNode(INT指数)
删除片段和文件的索引节点。
例外:
Puma.Xml.XmlExceptions.ChildCollectionXmlException [ChildCollectionExceptionCode = Puma.Xml.XmlExceptions.ChildCollectionExceptionCode.NodeIndexInvalid]
时发生的一个片段的索引超出范围(指数超过一个片段中的元素个数)。Puma.Xml.XmlNode类
类便于处理System.Xml.XmlElement类。
成员:
公共只读Puma.Xml.XmlXsdNode容器
这个类的容器。
属性:
公共System.Xml.XmlElement的XmlElement
所包含的System.Xml.XmlElement元素。Puma.Xml.XsdNode类
类便于处理System.Xml.Schema.XmlSchemaElement类。
成员:
公共只读Puma.Xml.XsdSimpleType XsdSimpleType
Puma.Xml.XsdSimpleType类
公共只读XmlXsdNode容器
这个类的容器。
属性:
公共System.Xml.Schema.XmlSchemaElement XmlSchemaElement
所包含的System.Xml.XmlSchemaElement元素。
公共BOOL IsComplexType
返回true表示该元素的复杂类型(包含子节点)。
公共Puma.Xml.MinMaxOccurs MinMaxOccurs
返回minOccurs和maxOccurs节点的属性。
公共字符串注释
返回节点的注释[XS:注释]。
公共BOOL的IsReadOnly
返回表示节点是只读[见msadata:ReadOnly属性]。
公共字符串标题
返回节点的标题[见msdata:标题属性]。Puma.Xml.XsdSimpleType类
类便于处理,它描述了一个节点类型从XSD文件中提取信息。
成员:
公共只读XsdNode集装箱
这个类的容器。
公共只读XmlSimpleTypeRestriction限制
获取该节点的限制。
属性:
公共System.Xml.Schema.XmlSchemaSimpleType SimpleType的
获取节点的简单类型。
公共System.Xml.Schema.XmlSchemaDatatype的DataType
获取的数据类型的节点。
公众的System.Type的ValueType
获取与XSD文档节点类型相关的系统类型。请参阅MSDN:映射XML数据类型的CLR类型。XmlSimpleTypeRestriction类
类便于与信息处理,节点类型的限制描述。
枚举:公共枚举XsdSimpleTypeRestriction{ MinLength = 0x1,等等 & #160;MAXLENGTH = 0x10的, MINVALUE = 0x100的, MaxValue的= 0x1000中, 枚举= 0x10000处, 均= 0x11111
这个枚举定义的限制类型。
属性:
公共System.Xml.Schema.XmlSchemaSimpleTypeRestriction限制
节点System.Xml.Schema.XmlSchemaSimpleTypeRestriction。
公共System.Xml.Schema.XmlSchemaObjectCollection胭脂
节点System.Xml.Schema.XmlSchemaSimpleTypeRestriction。
公共BOOL IsEnum
返回表示,如果节点类型枚举限制。
公共BOOL IsMinValue
返回表示,如果节点类型的minvalue限制。
公共BOOL IsMaxValue
返回表示,如果节点类型MAXVALUE限制。
BOOL IsMinLength
返回表示,如果节点类型minLength限制。
BOOL IsMaxLength
返回表示,如果节点类型的MaxLength限制。
公共INT MinLengthRestriction
返回的节点minLength限制。如果限制是没有找到,返回-1。
公共INT MaxLengthRestriction
返回节点的MaxLength限制。如果没有找到限制。返回-1。
公共EnumerationRestriction EnumerationRestriction
返回节点枚举限制
方法:
公共对象GetRestriction(XsdSimpleTypeRestriction TypeRestriction)
类型限制。如果这种类型的限制,没有找到,则返回null。返回对象的类型可能是下列之一:Puma.Xml.EnumerationRestriction,Puma.Xml.MinMaxLengthRestriction,Puma.Xml.MinMaxValueRestriction
公共对象GetFirstRestrictionValue(XsdSimpleTypeRestriction TypeRestriction)
获取不同类型的节点的限制值。如果有一个以上具有相同类型的限制(例如枚举),返回第一个。
公共对象[] GetRestrictions()
获取所有类型的节点限制。如果没有找到,则返回null。 GetRestriction方法返回的对象类型的信息,请参阅。
公共对象[] GetRestrictions(INT TypeRestrictions)
获取一个类型的节点类型限制数组。如果没有找到,则返回null。 GetRestriction方法返回的对象类型的信息,请参阅。鸣谢
感谢阿尼伯格在写这篇文章的贡献。"

回答

评论会员:Jasmine2501 时间:2011/12/07
感谢DotNetNuke的吸
评论会员:!Jez1 时间:2011/12/07
我有一个问题会发生什么时,存储在Web DB连接,在这种情况下,你可能有的。config的打包机配合
评论会员:克里斯汉布尔顿 时间:2011/12/07
不,它不会做任何的web.config - 你必须自己来管理这些吗?希望有帮助!克里斯
评论会员:克里斯汉布尔顿 时间:2011/12/07
为节省时间首先感谢。二是DNN文件格式丢失。这只是一个长字符串。任何简单的解决呢?
评论会员:boblogan 时间:2011/12/07
我会检查出来 - 我觉得有一种方法的XML写入到一个文件时,自动格式化,但我不能确定副手... ...
评论会员:Thakers 时间:2011/12/07
最后DnnGenerator.GenerateProjectDnnConfig可以缩进格式....{ BR}
/ /原线
return xmlDoc.InnerXml;

Repleace与----{ BR}
{C}
这将提供在屏幕上显示和保存的文件的默认XML缩进...

之前我曾尝试使用以下改变缩进 - xmlDoc.Save ....{ BR}但似乎是一个错误,我还没有找出在Microsoft XmlWriter对象...
工程优良,在其他运行时... ...因此,它包含完整性....{ BR}
writer.IndentChar = Chr(9) ' ='\t'

writer.Indentation = 3

此实用工具是一个伟大的发现对我来说,我有扩展的"排除"功能,包括子目录...
我经常有文件夹,其中包含不打算部署包项目,这些项目排除的文件夹比文件更容易...