1

我正在尝试在新的 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 文档只是简单地添加了前缀,就像我在不需要名称空间的情况下所做的一样(或者至少他们在代码示例中是这样显示的)。

任何帮助深表感谢 :)

4

2 回答 2

4

好吧,你确实需要一个命名空间。like<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);
    }
}

注意:您实际上并不需要在根元素中添加命名空间;只是如果您不这样做,您将xmlns:acp="yournamespace"在所有type元素中拥有该属性(因为该前缀不在范围内)。在父元素中添加它使得在子元素中添加它是不必要的。

于 2012-05-29T22:07:25.340 回答
1

我遇到了类似的问题,我发现内置的 .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>");
于 2012-05-29T21:55:23.003 回答