我正在尝试在新XMLDocument中的几个xmlnodes中添加前缀(从头开始创建100%,不从文件加载等)。
最简单的说法就是:
XmlDocument doc = new XmlDocument();
XmlElement RootElement = (XmlElement)doc.AppendChild(doc.CreateElement("root"));
foreach (string line in CSV)
{
XmlElement navPointElement = (XmlElement) RootElement.AppendChild(doc.CreateElement("navPoint"));
XmlElement navPointTypeElement =(XmlElement) navPointElement.AppendChild(doc.CreateElement("type"));
navPointTypeElement.Prefix = "acp";
navPointTypeElement.InnerText = nodeCount == 0 ? "cover" : "article";
}
还有更多的代码,但这可以让你了解我在做什么。现在文档输出正常,但它完全跳过前缀声明。我已经阅读了有关定义命名空间的内容,我尝试了以下内容无济于事。
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("acp", "http://www.namespace.com");
我确信这很简单,但我找不到任何关于它的文档。 xmldocument前缀的MSDN文档只是简单地添加前缀,而不需要命名空间(或至少它们在代码示例中显示它的方式)。
非常感谢任何帮助:)
答案 0 :(得分:4)
嗯,你确实需要一个命名空间。像<acp:type/>
这样的东西本身是无效的,因为acp
没有映射到任何名称空间,这就是前缀应该做的事情。
您需要做的是在type
元素的CreateElement调用上为要添加的元素设置名称空间。
public class StackOverflow_10807173
{
public static void Test()
{
XmlDocument doc = new XmlDocument();
XmlElement RootElement = (XmlElement)doc.AppendChild(
doc.CreateElement("root"));
string[] CSV = "hello world how are you".Split(' ');
int nodeCount = 0;
XmlAttribute xmlnsAttr = doc.CreateAttribute(
"xmlns", "acp", "http://www.w3.org/2000/xmlns/");
string acpNamespace = "http://www.namespace.com";
xmlnsAttr.Value = acpNamespace;
RootElement.Attributes.Append(xmlnsAttr);
foreach (string line in CSV)
{
XmlElement navPointElement = (XmlElement)RootElement.AppendChild(
doc.CreateElement("navPoint"));
XmlElement navPointTypeElement = (XmlElement)navPointElement.AppendChild(
doc.CreateElement("type", acpNamespace)); // namespace here
navPointTypeElement.Prefix = "acp";
navPointTypeElement.InnerText = nodeCount == 0 ? "cover" : "article";
}
Console.WriteLine(doc.OuterXml);
}
}
一个注意事项:您根本不需要在根元素中添加名称空间;只是如果你不这样做,你将在所有xmlns:acp="yournamespace"
元素中拥有type
属性(因为该前缀不在范围内)。在父元素中添加它会使它在子元素中添加它是不必要的。
答案 1 :(得分:0)
我遇到了类似的问题,我发现内置的.NET System.XML对象无法满足我的需求。
我需要使用NAXML标记在我们的POS系统中创建燃油价格变动记录。 元素的某些 需要“nax”前缀,而其他元素则不需要。 System.Xml对象似乎想要将其添加到 所有 元素或 none 。我无法将它们应用到我需要的元素上。
因为System.XML对象没有给我所需的粒度控件,所以我最终不得不使用System.Text.StringBuilder手动编写Xml。
我的应用程序中的示例代码可让您了解如何执行此操作:
System.Text.StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n");
sb.Append("<FuelPriceMaintenanceRequest xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://www.POSVENDOR.com/NAXML-Extension\" xmlns:nax=\"http://www.naxml.org/POSBO/Vocabulary/2003-10-16\" xsi:schemaLocation=\"http://www.POSVENDOR.com/NAXML-Extension FuelPriceMaintenance.xsd\">\r\n");
sb.Append(" <nax:TransmissionHeader>\r\n");
sb.Append(" <nax:StoreLocationID>" + StoreNumber.ToString() + "</nax:StoreLocationID>\r\n");
sb.Append(" </nax:TransmissionHeader>\r\n");
...snip...
sb.Append("</FuelPriceMaintenanceRequest>");