簡體   English   中英

如何基於XSD驗證規則添加XElement子級?

[英]How can I add an XElement child based on XSD validation rules?

我想將XElement子項添加到父XElement實例。 但是,我希望子元素的位置符合給定XSD中指定的規則。 具體來說,我希望子元素符合<xs:sequence>規則。 不過,如果我能找到一個考慮到任何XSD規則的解決方案,那就太好了。

這可能嗎? 我最初的想法是遍歷已經存在的每個子元素,然后嘗試添加新元素,然后驗證XDocument ,並在循環中繼續進行此操作,直到沒有驗證錯誤為止。 但是有更好的方法嗎?

更新資料

我有一個XML文件,該文件已創建並針對XSD架構進行了驗證(來自第3方,相當復雜)。

將XML文件加載為XDocument對象后,我的代碼的一部分找到了需要將新XElement實例添加到父XElement對象的位置。 無需過多介紹其工作原理,在此我簡化了概念:

XDocument doc = XDocument.Load(@"path\to\file.xml");
XElement parent = GetElementToAppend(doc);
XElement newElement = new XElement("NewElement",
                          new XAttribute("RequiredAttribute", "value"));
parent.Add(newElement);

但是,我不僅需要簡單地使用Add方法,還需要一種將新XElement插入有效位置的方法。 由於我要添加到完整的XML文檔中,因此父級可能已經具有許多其他子元素。 因此,我需要一種方法來查找第一個子元素,在該子元素中執行以下代碼不會導致XDocument架構驗證失敗:

XElement childElement = FindChildToAdd(parent, newElement);
childElement.AddAfterSelf(newElement);

我考慮過使用此線程中所述的XmlSchemaValidator類的GetExpectedParticles方法,但是實現似乎非常復雜。

我還考慮過執行以下類似操作以在XML中找到有效位置:

foreach (XElement el in parent.Elements()) {
    bool errors = false;
    el.AddAfterSelf(newElement);
    newElement.Validate(schemas, (o, e) => { errors = true; });

    if (!errors)
        break;

    newElement.Remove();
}

但這似乎效率極低。

一些上下文將是有用的。 什么是“ XElement”?

但是,我希望子元素的位置符合給定XSD中指定的規則。 具體來說,我希望子元素遵循規則。 不過,如果我能找到一個考慮到任何XSD規則的解決方案,那就太好了。

請提供您要考慮的“規則”示例。

您似乎正在處理一個非常不受約束的模型。 大多數XML應用程序都可以對將要處理的XML文檔的類型做出一些假設(除非它們僅需要根據提供的模式進行驗證而又不了解文檔的內容)。

您的申請似乎處在不幸的位置

a)您事先不知道XSD,並且

b)您需要以與XSD一致的方式來編輯XML文檔

我能問一下您的應用程序實際上在試圖做什么(除非該信息具有商業敏感性-不要讓自己被開除我的帳戶)?

如果您確實需要執行此操作,那么我認為GetExpectedParticles路由是唯一的選擇。 但是不要低估其中的復雜性-這是一個真正困難的問題,我懷疑這可能不是您真正需要解決的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM