将Any-Element添加到动态创建的XSD-Schema时出现问题

时间:2015-12-07 13:08:39

标签: c# xml xsd schema

我只想将Any-element节点添加到由此代码粒子创建的现有XSD-Schema中:

class ViewController {
    func googleMapDelegate(mapMoveToCoordinate: CLLocationCoordinate2D) {
        // Step 1: set new value on `viewModel.newCoordinate` and make a request
    }

    func handleViewModelCallBack(resultParam: ...*something*) {
        // Step 3: subscribeOn `viewModel.locationInfoResult` and do things.
    }
}

class ViewModel {
    //Result if a wrapper object of Alamofire.
    typealias LocationInfoResult = (Result<LocationInfo.Respond, NSError>) -> Void
    let newCoordinate = Variable<CLLocationCoordinate2D>(kInvalidCoordinate)
    let locationInfoResult: Observable<LocationInfoResult>

    init() {
        // Step 2: on newCoordinate change, from step 1, request Location Info
        // I could not find a solution at this step
        // how to make a `completionHandler` set its result on `locationInfoResult`
    }
}

创建XSD-Schemaset后,必须修改某些部分。以下代码设置现有元素的Min-和Max-Occurs属性,这些属性也可以正常工作。 在修改属性之后,我还必须将XmlSchemaElement类型的元素添加到XmlSchemaSequence的Items集合中,就像在示例代码末尾上面的几行中看到的那样。这不起作用。在调试时,我可以看到Items集合中的元素,但是在重新处理之后&amp;重新编译Schemaset,修改后的属性设置得很好,但生成的Any-element不存在,就像你在最终结果的MessageBox中看到的那样。有人可以帮忙吗?

    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();;
    } 

编译后的Schema的最终结果如下:

  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;
    }

感谢您的帮助! Br Matthias

2 个答案:

答案 0 :(得分:1)

您的问题是由于您使用了后期编译属性。正如帮助所有:

  

内容类型的粒子。 ContentType粒子的编译后值。

通常,使用.NET的SOM API的一个提示是查找具有setter的属性。 &#34;提示&#34;因为有些属性是:后编译和用户可配置。

如果复杂类型的定义具有明确的内容模型(扩展名或限制),则需要使用XmlSchemaComplexType.ContentModel。如果它是XmlSchemaComplexContent,则导航其Content属性(XmlSchemaComplexContentRestriction或XmlSchemaComplexContentExtension之一);每种类型都有一个Particle属性,你可以修改它。

否则,如果没有内容模型,只需访问XmlSchemaComplexType.Particle

答案 1 :(得分:0)

ContentTypeParticle是一个后编译属性。只能修改min- / max-Occurs等属性。要添加新节点,例如本例中的任何节点,必须修改Particle-property。在重新处理模式并重新编译SchemaSet之后,新元素将被添加到后编译的ContentTypeParticle中。 感谢@ Petru-Gardea