2015-01-28 4 views
0

У меня возникла проблема получения нескольких деклараций пространства имен в элементах, а не в центральном глобальном месте. Причина в том, что я создаю XElements с пространствами имен, а затем добавляю их в корневой элемент. Есть ли простой способ избежать этого? Вот упрощенный пример кода:Как получить пространства имен xml, объявленные глобально

private void testcode() 
    { 
     XNamespace ns_xsi = "http://www.w3.org/2001/XMLSchema-instance"; 
     XNamespace ns_xsd = "http://www.w3.org/2001/XMLSchema"; 
     XNamespace ns = "InstrumentMeasurement"; 

     // top-level element 
     XElement XResults = new XElement(ns + "Results"); 

     // this will happen many times 
     for(int i = 0; i<3; i++) 
     { 
      XElement XResult = 
       new XElement(ns + "Result", 
        new XAttribute(ns_xsi + "nil", true)); 
      XResults.Add(XResult); 
     } 

     // complete the XDoc and write to file 
     XDocument XReport = new XDocument(new XDeclaration("1.0", "utf-8", "yes")); 
     XReport.Add(XResults); 
     string strContent = XReport.Declaration.ToString() + Environment.NewLine + XReport; 
     System.IO.File.WriteAllText(@"c:\temp\doc.xml", strContent); 
     Console.WriteLine(@"written testfile c:\temp\doc.xml"); 
     return; 
    } 

и вот полученный XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Results xmlns="InstrumentMeasurement"> 
    <Result p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" /> 
    <Result p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" /> 
    <Result p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" /> 
</Results> 

вместо гораздо чище ищет нужную версию:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Results xmlns="InstrumentMeasurement 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Result xsi:nil="true" /> 
    <Result xsi:nil="true" /> 
    <Result xsi:nil="true" /> 
</Results> 

(кстати, то атрибут не является мусором, как я думал сначала, см., например, http://www.w3.org/TR/xmlschema-1/#xsi_nil)

ответ

0

Хорошо, я нашел ответ сам (RTFM) в C# 3.0 в двух словах (J + B Albahari, O'Reilly, 3rd ed, 2007, стр.386, бесплатно в книгах Google и других сайтах).

«Для того, чтобы намекнуть на сериалайзер до написания XML:»

XResults.SetAttributeValue(XNamespace.Xmlns + "xsi", ns_xsi); 
XResults.SetAttributeValue(XNamespace.Xmlns + "xsd", ns_xsd); 

Это не только решить мою оригинальную проблему, но и как добавить объявление пространства имен, не упоминается, но по-прежнему необходимо мой проект.

Хорошая, желательно, выход теперь:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Results xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns="InstrumentMeasurement"> 
    <Result xsi:nil="true" /> 
    <Result xsi:nil="true" /> 
    <Result xsi:nil="true" /> 
</Results>