以递归方式解析xsd complexType

时间:2014-05-18 17:24:45

标签: c# recursion xsd

private ElementDefinition ParseComplexType(XElement complexType, string nameValue = "")
        {
            var name = complexType.Attribute("name");

            ElementDefinition element = new ElementDefinition()
            {
                Elements = new List<ElementDefinition>(),
                ElementName = name != null ? name.Value : string.Empty
            };

            foreach (var el in complexType.Descendants().Where(k => k.Parent.Parent == complexType && k.Name.LocalName == "element"))
            {
                ElementDefinition tempElement = new ElementDefinition();
                var tempName = el.Attribute("name");
                var tempType = el.Attribute("type");

                if (tempName != null)
                {
                    tempElement.ElementName = tempName.Value;
                }
                if (tempType != null)
                {
                    var tempTypeValue = tempType.Value.Substring(tempType.Value.IndexOf(":") + 1, tempType.Value.Length - tempType.Value.IndexOf(":") - 1);
                    if (tipovi.Contains(tempTypeValue))
                    {
                        tempElement.ElementType = tempTypeValue;
                        element.Elements.Add(tempElement);
                    }
                    else
                    {
                        complexType = GetComplexType(tempTypeValue);
                        element.Elements.Add(ParseComplexType(complexType, tempName.Value));

                    }
                }

            }
            if (nameValue != "") element.ElementName = nameValue;

            return element;
        }

嗨所以这是我用来解析XSD complexTypes的函数。

这是我使用xsd Schema的xsd架构。 我在第14行解析complexType元素时遇到问题。

它只解析shipTo元素,跳过billTo并解析错误的项目。

结果为http://pokit.org/get/?b335243094f635f129a8bc74571c8bf2.jpg

我可以将哪些修复程序应用于此功能以便正常工作?

PS。 &#34; tipovi&#34;是xsd支持的类型列表,例如string,positiveInteger ....

已编辑:

private XElement GetComplexType(string typeName)
        {
            XNamespace ns = "http://www.w3.org/2001/XMLSchema";
            string x = "";
            foreach (XElement ele in xsdSchema.Descendants())
            {

                if (ele.Name.LocalName == "complexType" && ele.Attribute("name") != null)
                {

                    x = ele.Attribute("name").Value;
                    if (x == typeName)
                    {
                        return ele;
                    }
                }
            }
            return null;
        } 

GetComplexType查找元素类型的complexType定义。例如,对于&#34; PurchaseOrderType&#34; (第10行)它返回第14行的元素。

1 个答案:

答案 0 :(得分:1)

注意:这只是一个部分答案,因为它只解释了有关跳过的&#34; billTo&#34;元件。问题中提供的代码还有很多问题。


有关跳过billTo元素的问题

complexType变量用于foreach循环中Linq方法 Where 的谓词:

 complexType.Descendants().Where(k => k.Parent.Parent == complexType && k.Name.LocalName == "element"))

这个lambda表达式使用变量 complexType ,而不仅仅是它的值。

foreach 循环内深处向 complexType 分配另一个值

complexType = GetComplexType(tempTypeValue);

您还可以更改 foreach 循环中 Where 方法的谓词过滤哪些元素的逻辑。


修复

解决方案非常简单:不要在 foreach 循环中更改 complexType 变量。您可以像这样调用 GetComplexType

XElement complexTypeUsedByElement = GetComplexType(tempTypeValue);
element.Elements.Add(ParseComplexType(complexTypeUsedByElement, tempName.Value));