Как добавить пространство имен по умолчанию в загруженный XmlDocument, чтобы проверка работала - PullRequest
2 голосов
/ 13 февраля 2012

У нас есть некоторые данные XML, которые используют определенное пространство имен, но фактически не объявляют пространство имен для него. Мы хотим проверить это, но недопустимые элементы в пространстве имен по умолчанию не обнаруживаются, потому что xmlns не установлено, поэтому по правилам xml все идет. На этом этапе обработки документ, возможно, был загружен в течение длительного времени и, в любом случае, не обязательно находится в исходном виде (так что об администраторе пространства имен, вероятно, не может быть и речи).

<root>
   <valid />
   <notvalid />
</root>
var xd = new XmlDocument();
xd.Load(xmlstring);
xd.Validate((sender, args) =>
{
   ...
});

1 Ответ

5 голосов
/ 13 февраля 2012

Вы не можете изменять XmlDocument на лету, потому что XmlNodes уже созданы с определенным пространством имен. Вы должны изменить документ и повторно обработать его / перечитать через XmlNodeReader. Вы можете установить атрибуты в XmlDocument, но для пространства имен они фактически будут применять что угодно только после перезагрузки документа (из модифицированной копии).

var target = "urn:foobar";
var xd = new XmlDocument();
xd.Load(xmlstring);

// set default namespace to a schema identifier, 
// this is not enforced in this 'xd' document yet.
xd.DocumentElement.SetAttribute("xmlns", target);
var newXd = new XmlDocument();

// reload document into new instance
newXd.Load(xd.OuterXml);

// attach the schema URI to schema identifier
newXd.Schemas.Add(target, "file:///c|/temp/foobar.xsd");
newXd.Validate((sender, args) => {
    ... // now elements in default namespace are validated against "foobar.xsd"
});

Это, вероятно, было бы "лучше" сделать с XmlNodeReader, LAAEFTR.

...