Я в процессе создания механизма экспорта, который будет принимать данные нашей компании и экспортировать ее как XML на основе шаблона, содержащегося в нашей базе данных. Один из экспорта, который мне нужно реализовать, должен иметь атрибут xsi: nil = "true", добавленный к элементу, когда значение элемента равно null.Управление именами пространства имен XElement
Я просматриваю каждый элемент в списке экспорта, генерирую его внутренние объекты XElement (на основе наших правил) и сохраняю представление .ToString() в базе данных. После создания всех внутренних фрагментов они извлекаются из db, анализируются обратно в объекты XElement и добавляются во внешний корень xml. (Наличие всего в базе данных позволяет приостанавливать экспорт, возобновлять экспорт после перезапуска сервера и т. Д.)
Я указал пространство имен xsi во внешнем корне, однако это не сработает при добавлении внутреннего анализа XElement ,
Это представление о том, как в настоящее время работает мой код:
//Generate inner xml
XElement innerElement = new XElement("inner");
XNamespace xsi = @"http://www.w3.org/2001/XMLSchema-instance";
XAttribute attrib = new XAttribute(xsi + "nil", "true");
innerElement.Add(attrib);
//Mock out saving XElement as string
string innerString = innerElement.ToString();
XElement innerElementParsed = XElement.Parse(innerString);
//Add innerxml to outer xml root
XNamespace outerXsi = "http://www.w3.org/2001/XMLSchema-instance";
XAttribute outerAttrib = new XAttribute(XNamespace.Xmlns + "xsi", outerXsi);
XElement outerElement = new XElement("Outer", outerAttrib);
outerElement.Add(innerElementParsed);
return outerElement.ToString();
Я получаю следующие результаты
<Outer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<inner p1:nil="true" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" />
</Outer>
Я не могу понять, как заставить его не использовать Expanded имен (к низу на этой странице: http://msdn.microsoft.com/en-us/library/system.xml.linq.xnamespace.aspx)
Если бы я смог удалить шаг «.ToString()», чтобы сохранить его в базе данных посередине, у меня не было бы этой возможности m, поскольку добавление всех элементов XElement напрямую разрешает пространства имен правильно.
Итак, мой вопрос: есть ли способ контролировать синтаксический анализ, чтобы он не использовал расширенное имя p1 и вместо этого использовал пространство имен внешнего XElement? OR Есть ли что-то, что будет смотреть на расширенное имя и видеть, что оно совпадает с корнем и поэтому удаляет его?