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行的元素。
答案 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));