未输出 XML 文档前缀
本文关键字:前缀 文档 XML 输出 未输 | 更新日期: 2023-09-27 18:35:44
我正在尝试在新的XMLDocument中的几个xmlnode上添加一个前缀(从头开始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 文档只是简单地添加前缀,与我所做的非常相似,不需要命名空间(或者至少这是他们在代码示例中显示它的方式)。
任何帮助都非常感谢:)
嗯,你确实需要一个命名空间。像 <acp:type/>
这样的东西本身是无效的,acp
因为它没有映射到任何命名空间,而这正是前缀应该做的。
您需要做的是在调用 CreateElement 时为type
元素设置要添加的元素的命名空间。
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);
}
}
一个注意事项:你实际上不需要在根元素中添加命名空间;只是如果你不这样做,你将在所有type
元素中拥有xmlns:acp="yournamespace"
属性(因为该前缀不在范围内)。在父元素中添加它使得在子元素中添加它变得不必要。
我遇到了类似的问题,我发现内置的 .NET 系统.XML对象无法执行我需要的操作。
我需要使用 NAXML 标记在我们的 POS 系统中创建燃料价格变化记录。 一些元素需要"nax"前缀,而其他元素则不需要。 System.Xml 对象似乎希望将其添加到所有元素中,或者不添加到任何元素中。 我无法让它将它们应用于我需要的元素。
由于 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>");