2013-06-04 7 views
0

Я в процессе создания механизма экспорта, который будет принимать данные нашей компании и экспортировать ее как 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 Есть ли что-то, что будет смотреть на расширенное имя и видеть, что оно совпадает с корнем и поэтому удаляет его?

ответ

0

Что мы решили сделать, так это добавить «внешний» XElement (с соответствующими объявленными пространствами имен) вокруг каждого из результатов перед тем, как сделать .ToString() и сохранить их в базе данных. Затем, когда мы вытаскиваем xml-результаты элемента из базы данных и анализируем его обратно в XElement, мы смотрим на это свойство XElement .Elements() и вытягиваем его в наш более крупный «конечный» объект XElement вместо самого проанализированного XElement.