У меня возникла проблема получения нескольких деклараций пространства имен в элементах, а не в центральном глобальном месте. Причина в том, что я создаю 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)