如何在C#中添加具有不同前缀/命名空间的xml属性?

6
我需要能够创建一个看起来像这样的 XML 文档:
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <rootprefix:rootname 
     noPrefix="attribute with no prefix"
     firstprefix:attrOne="first atrribute"
     secondprefix:attrTwo="second atrribute with different prefix">

     ...other elements...

 </rootprefix:rootname>

这是我的代码:

XmlDocument doc = new XmlDocument();

XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
doc.AppendChild(declaration);

XmlElement root = doc.CreateElement("rootprefix:rootname", nameSpaceURL);
root.SetAttribute("schemaVersion", "1.0");

root.SetAttribute("firstprefix:attrOne", "first attribute");
root.SetAttribute("secondprefix:attrTwo", "second attribute with different prefix");

doc.AppendChild(root);

不幸的是,我使用第二个前缀获取第二个属性时根本没有前缀。它只是“attrTwo”,就像schemaVersion属性一样。

那么,在C#中有没有一种方法可以为根元素中的属性设置不同的前缀?

2个回答

2
这只是为您提供的指南。您可以尝试以下操作:
        NameTable nt = new NameTable();
        nt.Add("key");

        XmlNamespaceManager ns = new XmlNamespaceManager(nt);
        ns.AddNamespace("firstprefix", "fp");
        ns.AddNamespace("secondprefix", "sp");

        root.SetAttribute("attrOne", ns.LookupPrefix("fp"), "first attribute");

        root.SetAttribute("attrTwo", ns.LookupPrefix("sp"), "second attribute with different prefix");

这将导致:
        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <rootprefix:rootname schemaVersion="1.0" d1p1:attrOne="first attribute" d1p2:attrTwo="second attribute with different prefix" xmlns:d1p2="secondprefix" xmlns:d1p1="firstprefix" xmlns:rootprefix="ns" />

希望这可以帮到您!

值得注意的是,只有在您需要确定命名空间的简写而不是默认命名约定(d1p1、d1p2等)时,才需要使用NameTable和AddNameSpace。 - Tomer W

1

我看到了另一个问题的帖子,最终解决了这个问题。 我基本上只是创建了一个包含所有xml的字符串,然后在XmlDocument的实例上使用了LoadXml方法。

string rootNodeXmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"    
    + "<rootprefix:rootname schemaVersion=\"1.0\" d1p1:attrOne=\"first attribute\"" 
    + "d1p2:attrTwo=\"second attribute with different prefix\" xmlns:d1p2=\"secondprefix\""
    + "xmlns:d1p1=\"firstprefix\" xmlns:rootprefix=\"ns\" />";
doc.LoadXml(rootNodeXmlString);

这是最快的解决方案。谢谢你。我也这样做了,然后稍后用所需的 XML 替换了 InnerXml。我认为使用标准 API 定制输出方式非常困难。你无法控制属性写入的顺序。 - Konrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接