我有一个XML文件,如:
<myPrefix:Catalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:myPrefix="clr-namespace:........">
<myPrefix:Item Name="Item1" Mode="All" />
<myPrefix:Item Name="Item2" Mode="Single" />
</myPrefix:Catalog>
使用C#我创建一个新项目,如:
XContainer container = XElement.Parse(xml);
XElement xmlTree =
new XElement("Item",
new XAttribute("Name", item.Name),
new XAttribute("Mode", item.Mode));
如您所见,我不添加“myPrefix”前缀。谁能告诉我怎么能这样做?我不想再声明xmlns。谢谢,彼得
答案 0 :(得分:7)
XElement container = XElement.Parse(xml);
XNamespace myPrefix = container.GetNamespaceOfPrefix("myPrefix");
XElement xmlTree = new XElement(myPrefix + "Item",
new XAttribute("Name", item.Name),
new XAttribute("Mode", item.Mode));
container.Add(xmlTree);
答案 1 :(得分:3)
编辑1:
如果将namespace属性以及元素添加到元素中,则会强制它添加前缀。但是您仍然在节点中使用xmlns属性。 要删除它,你可能正如Jeff所说,需要使用XmlWriter。
编辑2:
要获得您想要的EXACT XML,您还需要创建根元素:
编辑3:
好。我找到了一种在没有XmlWriter的情况下获得所需内容的方法:
var xml = "<myPrefix:Catalog xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" xmlns:myPrefix=\"clr-namespace:........\"><myPrefix:Item Name=\"Item1\" Mode=\"All\" /></myPrefix:Catalog>";
XNamespace presentation = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
XNamespace xaml = "http://schemas.microsoft.com/winfx/2006/xaml";
XNamespace mscorlib = "clr-namespace:System;assembly=mscorlib";
XNamespace myPrefix = "clr-namespace:.......";
XElement container = XElement.Parse(xml);
var xmlTree = new XElement("Item",
new XAttribute("Name", "Item2"),
new XAttribute("Mode", "Single"));
container.Add(xmlTree);
foreach (var el in container.DescendantsAndSelf())
{
el.Name = myPrefix.GetName(el.Name.LocalName);
var atList = el.Attributes().ToList();
el.Attributes().Remove();
foreach (var at in atList)
{
if (el.Name.LocalName == "Catalog" && at.Name.LocalName != "xmlns")
continue;
el.Add(new XAttribute(at.Name.LocalName, at.Value));
}
}
container.Add(new XAttribute(XNamespace.Xmlns + "x", xaml));
container.Add(new XAttribute(XNamespace.Xmlns + "sys", mscorlib));
container.Add(new XAttribute(XNamespace.Xmlns + "myPrefix", myPrefix));
编辑4:
显然有一种更简单的方法......更容易......看到其他答案。
答案 2 :(得分:2)
您需要在命名空间中构造任何新元素。假设您知道XML样本中所需命名空间的前缀,请按以下步骤操作:
var xml = "<myPrefix:Catalog xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" xmlns:myPrefix=\"clr-namespace:........\"><myPrefix:Item Name=\"Item1\" Mode=\"All\" /></myPrefix:Catalog>";
XElement catalog = XElement.Parse(xml);
XNamespace myP = catalog.GetNamespaceOfPrefix("myPrefix");
catalog.Add(new XElement(myP + "Item", new XAttribute("Name", "foo"), new XAttribute("Mode", "bar")));