将 Any-Element 添加到动态创建的 XSD-Schema 时出现问题
Problems adding Any-Element to dynamically created XSD-Schema
我只想将一个 Any-element 节点添加到现有的 XSD-由此代码粒子创建的模式:
private void CreateSchema()
{
//This function returns the XML Schema definition of a XML Element by using the Generation function of a Dataset
XmlSchemaInference x_scheme = new XmlSchemaInference();
this.XsDSchemaSet = x_scheme.InferSchema(this.myXmlElement.CreateReader());
this.XsDSchemaSet.Compile();;
}
在我创建 XSD-Schemaset 之后,一些部分必须修改。下面的代码设置了现有元素的 Min- 和 max-Occurs 属性,这也能正常工作。
修改属性后,我还必须将 XmlSchemaElement 类型的元素添加到 XmlSchemaSequence 的项目集合中,就像您在示例代码末尾上方的几行中看到的那样。那是行不通的。调试时我可以看到 Items 集合中的元素,但是在重新处理和重新编译 Schemaset 之后,修改后的属性设置得很好,但是生成的 Any-element 并不像您在最终结果的 MessageBox 中看到的那样存在。有人可以帮忙吗?
private bool ModifyXsdElement(XmlSchemaElement element, XElement myXmlElement)
{
// this function modifies the occurance min an max of the child elements
XmlSchemaSimpleType simpleType = element.ElementSchemaType as XmlSchemaSimpleType;
if (simpleType != null)
{
MessageBox.Show("Function XsdModifyElement: Error - Simple Type!");
return false;
}
else
{
XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;
if (complexType != null) //This is a complexType object
{
if (complexType.AttributeUses.Count > 0)
{
//todo: anything if there are attributes
}
bool typeMatch = false;
XmlSchemaSequence sequence = complexType.ContentTypeParticle as XmlSchemaSequence;
if (sequence != null)
{
typeMatch = true;
string fixedValue = string.Empty;
XmlSchemaElement el = new XmlSchemaElement();
foreach (XmlSchemaElement childElement in sequence.Items)
{
//MessageBox.Show("Child Element: " + childElement.Name);
int iOccCtr = GetNoOfXmlChildElements(childElement.Name, myXmlElement);
childElement.MinOccurs = iOccCtr;
childElement.MaxOccurs = iOccCtr;
childElement.MinOccursString = iOccCtr.ToString();
childElement.MaxOccursString = iOccCtr.ToString();
if (FixedValues.TryGetValue(childElement.Name.ToString(), out fixedValue))
childElement.FixedValue = fixedValue;
el = childElement;
}
//Add any element
XmlSchemaAny anyElement = new XmlSchemaAny();
anyElement.MinOccurs = 0;
anyElement.MaxOccurs = 1;
anyElement.ProcessContents = XmlSchemaContentProcessing.Lax;
anyElement.Parent = sequence;
sequence.Items.Add(anyElement);
}
}
}
return true;
}
编译 Schema 的最终结果如下所示:
<?xml version=\"1.0\"?>
<xs:schema attributeFormDefault=\"unqualified\" elementFormDefault=\"unqualified\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">
<xs:element name=\"STEP\">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs=\"1\" maxOccurs=\"1\" fixed=\"0002\" name=\"LFDNR\" type=\"xs:unsignedByte\" />
<xs:element minOccurs=\"1\" maxOccurs=\"1\" name=\"FUNKTIONSNUMMER\" />
<xs:element minOccurs=\"1\" maxOccurs=\"1\" fixed=\"Firmwareinformationen lesen\" name=\"FUNKTIONSNAME\" type=\"xs:string\" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
感谢您的帮助!
Br 马蒂亚斯
您的问题是由于您使用了 post 编译 属性。如帮助所示:
The particle for the content type. The post-compilation value of the ContentType particle.
一般来说,使用 .NET 的 SOM API 的一个提示是寻找也具有 setter 的属性。 "hint" 因为有些属性是:post 编译和用户可配置。
如果您的复杂类型的定义具有明确的内容模型(扩展或限制),那么您需要使用 XmlSchemaComplexType.ContentModel. If it's an XmlSchemaComplexContent, navigate its Content 属性(XmlSchemaComplexContentRestriction 或 XmlSchemaComplexContentExtension 之一);这些类型中的每一种都有一个粒子 属性,这是您可以修改的粒子。
否则,如果没有内容模型,只需访问 XmlSchemaComplexType.Particle。
ContentTypeParticle 是 post 编译的 属性。只有 min-/max-Occurs 等属性可以修改。要添加新节点,如本例中的任何节点,必须修改 Particle-属性。在重新处理架构和重新编译 SchemaSet 之后,新元素将添加到 post-compiled ContentTypeParticle。
感谢@Petru-Gardea
我只想将一个 Any-element 节点添加到现有的 XSD-由此代码粒子创建的模式:
private void CreateSchema()
{
//This function returns the XML Schema definition of a XML Element by using the Generation function of a Dataset
XmlSchemaInference x_scheme = new XmlSchemaInference();
this.XsDSchemaSet = x_scheme.InferSchema(this.myXmlElement.CreateReader());
this.XsDSchemaSet.Compile();;
}
在我创建 XSD-Schemaset 之后,一些部分必须修改。下面的代码设置了现有元素的 Min- 和 max-Occurs 属性,这也能正常工作。 修改属性后,我还必须将 XmlSchemaElement 类型的元素添加到 XmlSchemaSequence 的项目集合中,就像您在示例代码末尾上方的几行中看到的那样。那是行不通的。调试时我可以看到 Items 集合中的元素,但是在重新处理和重新编译 Schemaset 之后,修改后的属性设置得很好,但是生成的 Any-element 并不像您在最终结果的 MessageBox 中看到的那样存在。有人可以帮忙吗?
private bool ModifyXsdElement(XmlSchemaElement element, XElement myXmlElement)
{
// this function modifies the occurance min an max of the child elements
XmlSchemaSimpleType simpleType = element.ElementSchemaType as XmlSchemaSimpleType;
if (simpleType != null)
{
MessageBox.Show("Function XsdModifyElement: Error - Simple Type!");
return false;
}
else
{
XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;
if (complexType != null) //This is a complexType object
{
if (complexType.AttributeUses.Count > 0)
{
//todo: anything if there are attributes
}
bool typeMatch = false;
XmlSchemaSequence sequence = complexType.ContentTypeParticle as XmlSchemaSequence;
if (sequence != null)
{
typeMatch = true;
string fixedValue = string.Empty;
XmlSchemaElement el = new XmlSchemaElement();
foreach (XmlSchemaElement childElement in sequence.Items)
{
//MessageBox.Show("Child Element: " + childElement.Name);
int iOccCtr = GetNoOfXmlChildElements(childElement.Name, myXmlElement);
childElement.MinOccurs = iOccCtr;
childElement.MaxOccurs = iOccCtr;
childElement.MinOccursString = iOccCtr.ToString();
childElement.MaxOccursString = iOccCtr.ToString();
if (FixedValues.TryGetValue(childElement.Name.ToString(), out fixedValue))
childElement.FixedValue = fixedValue;
el = childElement;
}
//Add any element
XmlSchemaAny anyElement = new XmlSchemaAny();
anyElement.MinOccurs = 0;
anyElement.MaxOccurs = 1;
anyElement.ProcessContents = XmlSchemaContentProcessing.Lax;
anyElement.Parent = sequence;
sequence.Items.Add(anyElement);
}
}
}
return true;
}
编译 Schema 的最终结果如下所示:
<?xml version=\"1.0\"?>
<xs:schema attributeFormDefault=\"unqualified\" elementFormDefault=\"unqualified\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">
<xs:element name=\"STEP\">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs=\"1\" maxOccurs=\"1\" fixed=\"0002\" name=\"LFDNR\" type=\"xs:unsignedByte\" />
<xs:element minOccurs=\"1\" maxOccurs=\"1\" name=\"FUNKTIONSNUMMER\" />
<xs:element minOccurs=\"1\" maxOccurs=\"1\" fixed=\"Firmwareinformationen lesen\" name=\"FUNKTIONSNAME\" type=\"xs:string\" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
感谢您的帮助! Br 马蒂亚斯
您的问题是由于您使用了 post 编译 属性。如帮助所示:
The particle for the content type. The post-compilation value of the ContentType particle.
一般来说,使用 .NET 的 SOM API 的一个提示是寻找也具有 setter 的属性。 "hint" 因为有些属性是:post 编译和用户可配置。
如果您的复杂类型的定义具有明确的内容模型(扩展或限制),那么您需要使用 XmlSchemaComplexType.ContentModel. If it's an XmlSchemaComplexContent, navigate its Content 属性(XmlSchemaComplexContentRestriction 或 XmlSchemaComplexContentExtension 之一);这些类型中的每一种都有一个粒子 属性,这是您可以修改的粒子。
否则,如果没有内容模型,只需访问 XmlSchemaComplexType.Particle。
ContentTypeParticle 是 post 编译的 属性。只有 min-/max-Occurs 等属性可以修改。要添加新节点,如本例中的任何节点,必须修改 Particle-属性。在重新处理架构和重新编译 SchemaSet 之后,新元素将添加到 post-compiled ContentTypeParticle。 感谢@Petru-Gardea