Вы можете использовать .NET 3.5? Если это так, LINQ-to-XML может быть проще в использовании. Вот некоторый код, который я протестировал и который в точности выведет XML в вашем вопросе:
XNamespace ns2 = "some-uri";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XElement root = new XElement("Root",
// Define ns2 namespace on Root element
new XAttribute(XNamespace.Xmlns + "ns2", ns2.NamespaceName),
new XElement(ns2 + "ProcessRepairOrder",
// Attributes of ProcessRepairOrder
new XAttribute("languageCode", "de-DE"),
new XAttribute("releaseID", "1.0"),
new XAttribute("systemEnvironmentCode", "PROD"),
new XAttribute("versionID", "1.0"),
// Child elements of ProcessRepairOrder
new XElement(ns2 + "ApplicationArea",
new XElement(ns2 + "Sender",
new XElement(ns2 + "CreatorNameCode",
// Attributes of CreatorNameCode and define xsi namespace
new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
new XAttribute(xsi + "type", "ns3:TextType"),
// Value of CreatorNameCode,
"SomeVendor"
),
new XElement(ns2 + "SenderNameCode",
// Attributes of SenderNameCode
new XAttribute("name", "Dave")
)
)
)
)
);
Вы можете посмотреть эту страницу MSDN , чтобы узнать, как создать XML-файл, используя LINQ-to-XML, а эта ссылка объясняет, как применять к ним пространства имен XML. *
Отредактировано:
Исходя из ваших комментариев ниже, кажется, что вам нужен менее стандартный подход, поскольку у вас не может быть корневого элемента, который я определил выше, но LINQ-to-XML, кажется, требует его для создания действительного Структура XML с определенными правильными пространствами имен. Если вы хотите использовать этот подход, то есть способ обойти это, но он требует немного больше возиться с выводом.
Использование кода, который я написал выше, а затем выполнение root.Elements().First().ToString()
приведет к получению этого сериализованного XML:
<ns2:ProcessRepairOrder languageCode="de-DE" releaseID="1.0" systemEnvironmentCode="PROD" versionID="1.0" xmlns:ns2="some-uri">
<ns2:ApplicationArea>
<ns2:Sender>
<ns2:CreatorNameCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:TextType">SomeVendor</ns2:CreatorNameCode>
<ns2:SenderNameCode name="Dave" />
</ns2:Sender>
</ns2:ApplicationArea>
</ns2:ProcessRepairOrder>
Почти там, но обратите внимание, что LINQ-to-XML вставил пространство имен xmlns:ns2
в ProcessRepairOrder
, потому что для использования элементов ns2
во всей иерархии его необходимо где-то определить. Но теперь, когда у вас есть это в строковом формате, вы можете легко использовать String.Replace()
, чтобы удалить это, и вы получите то, что вам нужно.
Я бы не сказал, что это элегантное решение, но оно подойдет для вашего нестандартного метода создания XML.