簡體   English   中英

在不考慮xml名稱的情況下針對xsd驗證xml

[英]Validate xml against xsd without considering xml namesapce

我正在使用以下代碼針對xsd驗證我的xml。

var isXmlValid = true;
var vinListMessage = "<root xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"urn:test/properties/v1.0\"><test12121 id=\"3\"></test></root>";
var xsdFilePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "schema.xsd");
var schemas = new XmlSchemaSet();
schemas.Add(null, xsdFilePath);
var xmlDocument = XDocument.Parse(vinListMessage);
xmlDocument.Validate(schemas, (o, e) => { isXmlValid = false; });
Console.WriteLine(isXmlValid);

請注意上述xml中的xmlns,其urn:test/properties/v1.0 現在在我的xsd中,我有targetnamespace作為targetNamespace="urn:testnew/properties/v1.0" ,它與xml中的不同。

現在,無論我嘗試針對xsd進行驗證的任何xml,它都始終返回true。 但是,如果我匹配名稱空間,那么它就可以正常工作。 我想避免依賴命名空間。 有什么建議么?

名稱空間是元素名稱的一部分,因此除了確保它們正確之外,您無能為力。

如果假定所有元素名稱空間都相同,則可以在驗證之前在所有元素上設置名稱空間:

XNamespace ns = "urn:testnew/properties/v1.0";

foreach (var element in xmlDocument.Descendants())
{
    element.Name = ns + element.Name.LocalName;
}

xmlDocument.Validate(...);

不幸的是,如果名稱空間不匹配,則XML根據模式是有效的(假設它格式正確),因為該模式根本不適用於元素。 盡管無法通過XDocument.Validate擴展方法傳遞此標志(據我所知!),但驗證可能會發出警告,指出無法識別元素。

此問題顯示了使用XmlReaderXmlReaderSettings的替代驗證方法,該驗證方法將允許您在架構無法識別元素時捕獲警告。

暫無
暫無

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

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