У меня есть функция, которая генерирует xml для объекта списка:
public XDocument ToXML()
{
foreach (var row in this)
{
var xml = row.ToXml();
template.Root.Add(xml);
}
return template;
}
Шаблон. ToString () чтения: <RootElement xmlns="urn:testTools">
Чтения xml: <Example><SubElement>testData</SubElement></Example>
После того, как добавить функция выполнила шаблон. ToString () чтения: <RootElement xmlns="urn:testTools"><Example xmlns=""><SubElement>testData</SubElement></Example>
Так по некоторым причинам было пустое добавленное пространство имен, как я могу препятствовать тому, чтобы оно делало так?
Задайте пространство имен для элементов Example и SubElement таким же, как у RootElement. Он добавляет xmlns = "", чтобы очистить пространство имен для этих элементов.
Возможно, ваш корень необходимо правильно закрыть:
<RootElement xmlns="urn:testTools"> to <RootElement xmlns="urn:testTools"/>
Я решил эту проблему, заменив элементы на регулярное выражение. Решение Foole не сработало, потому что я не всегда мог точно указать пространство имен в этой точке кода.
Вот мой грязный прием, который работает:
template = XDocument.Parse(new Regex("<ElementName.*>")
.Replace(template.ToString(SaveOptions.DisableFormatting), "<ElementName>"));
Вот пример вывода xml без пустых пространств имен. Обратите внимание на причудливый Linq-ориентированный синтаксис rootNamespace + «MyElementName», в котором и есть секрет. Это то же пространство имен, что и весь документ, поэтому добавление xmlns не требуется. Это конкатенация XNamespace + строки, которая является перегрузкой «+», которая работает для Linq и с которой Linq знает, как бороться. (Без Linq это могло быть ошибкой компиляции, чтобы объединить строку и тип, не являющийся строкой). Обратите внимание, что это было выполнено с файлом проекта C #, который является удобным файлом Xml. Выведите его на консоль или в элемент управления richtextbox. Затем выньте "rootNamespace +" и обратите внимание на разницу.
XDocument doc = null;
using (StreamReader streamReader =
new StreamReader(@"myXml.csproj"))
{
doc = XDocument.Load(streamReader, LoadOptions.None);
}
XNamespace rootNamespace = doc.Root.Name.NamespaceName;
// A search which finds the ItemGroup which has Reference
// elements and returns the ItemGroup XElement.
XElement element = doc.Descendants().Where(p => p.Name.LocalName == "ItemGroup"
&& p.Descendants().First<XElement>().Name.LocalName == "Reference").First<XElement>();
// Create a completly new element with sub elements.
XElement referenceElement = new XElement(rootNamespace + "Reference",
new XElement(rootNamespace + "SpecificVersion", bool.FalseString),
new XElement(rootNamespace + "HintPath", "THIS IS A HINT PATH"));
// Add the new element to the main doc, to the end of the Reference elements.
element.Add(referenceElement);
// Add an attribute after the fact for effect.
referenceElement.SetAttributeValue("Include", "THIS IS AN INCLUDE");
rtb.Text = doc.ToString(SaveOptions.None);