XDocument.Validate如何在错误后继续验证?

时间:2013-12-10 16:21:17

标签: validation linq-to-xml schema xelement

我有一点问题,无法弄清楚如何解决它。 我正在针对模式验证XDocument,我得到所有有错误的节点。但是在发现错误后,验证过程不会更深入。

     _document.Validate(_schema, (o, e) =>
        {
            XElement xEle = null;
            if (o is XAttribute)
                xEle = (o as XAttribute).Parent;
            if (o is XElement)
                xEle = o as XElement;
            if (xEle == null)
            {
                Debug.WriteLine(o.ToString());
                return;
            }
            _elemtList.Add(o as XElement);
        });

我的问题就像关注

<Car>
<CarName></CarName>
<CarInteriour>
    <CarInteriorColor>Red</CarInteriorColor>
</CarInteriour>
</Car>

让我们说这是有效的。 如果我将以下内容更改为

<Car>
<CarInteriour>
    <CarInteriorColor></CarInteriorColor>
</CarInteriour>
</Car>

这里缺少CarName标签,颜色为红色。 我只会得到CarName的错误而不是红色。 验证过程似乎跳过了该结构,因为它确实发现了错误。 即使出现错误,还有办法继续验证吗?

1 个答案:

答案 0 :(得分:1)

好的,我发现了一个适合我的解决方案,我正在给你一个更新,因为它非常整洁。

我现在在做什么。我在_document.Descendants()中为每个XElement使用foreach,并验证每个元素。这会多次查找文档中的每个错误。 所以我做的是,如果我之前已经找到了这个错误,我会检查我的错误列表。我的错误列表是我自己的类errorcontainer的列表,其中包含找到的带有错误消息的XElement。 这样我只会在列表中添加新错误并在对话框中显示此错误。用户现在可以选择错误,我将直接跳转到编辑器中的错误。

                ErrorContainer errorContainer = new ErrorContainer(xEle, e.Message);
                if (_errors.Any(error => error.xElement.Equals(errorContainer.xElement) && string.CompareOrdinal(error.errorMessage, errorContainer.errorMessage) == 0))
                {
                    return;
                }
                _errors.Add(errorContainer);

我希望这可以帮助其他需要帮助解决此问题的人:)