【发布时间】:2016-03-12 02:27:54
【问题描述】:
我只想将一个 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-collection 中,就像您在示例代码末尾上方的几行中看到的那样。那是行不通的。在调试时,我可以看到 Items-collection 中的元素,但是在重新处理和重新编译 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>
感谢您的帮助! 马蒂亚斯兄弟
【问题讨论】: