如何使用XmlDocument向根元素添加多个命名空间?

7 浏览
0 Comments

如何使用XmlDocument向根元素添加多个命名空间?

我需要创建一个包含多个命名空间的根元素的XmlDocument。我正在使用C# 2.0或3.0。

这是我的代码:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("JOBS", "http://www.example.com");
doc.AppendChild(root);
XmlElement job = doc.CreateElement("JOB", "http://www.example.com");
root.AppendChild(job);  
XmlElement docInputs = doc.CreateElement("JOB", "DOCINPUTS", "http://www.example.com");
job.AppendChild(docInputs);  
XmlElement docInput = doc.CreateElement("JOB", "DOCINPUT", "http://www.example.com");
docInputs.AppendChild(docInput);  
XmlElement docOutput = doc.CreateElement("JOB", "DOCOUTPUT", "http://www.example.com");
docOutputs.AppendChild(docOutput);  

当前输出结果:


  
    
      
    
    
      
    
  

然而,我期望的输出结果是:


  
    
      
    
  
    
  
  

我的问题是:如何创建一个包含多个命名空间的XmlDocument的根元素?

0
0 Comments

问题的原因是作者想要在根元素中添加多个命名空间,但是尝试使用SetAttribute方法来添加命名空间时遇到了问题。

解决方法是使用XmlDocument类和相关方法来创建元素和命名空间。以下是解决方法的代码示例:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("JOBS", "http://www.example.com");
root.SetAttribute("xmlns:JOB", "http://www.example.com"); 
doc.AppendChild(root);
XmlElement job = doc.CreateElement("JOB", "http://www.example.com");
root.AppendChild(job);
XmlElement docInputs = doc.CreateElement("JOB", "DOCINPUTS", "http://www.example.com");
job.AppendChild(docInputs);
XmlElement docInput = doc.CreateElement("JOB", "DOCINPUT", "http://www.example.com");
docInputs.AppendChild(docInput);
XmlElement docOutput = doc.CreateElement("JOB", "DOCOUTPUT", "http://www.example.com");
root.AppendChild(docOutput);

以上代码通过创建XmlDocument实例并使用CreateElement方法来创建元素。在创建元素时,可以指定命名空间的前缀和URI。然后,使用AppendChild方法将创建的元素添加到相应的父元素中。

这样就成功地在根元素中添加了多个命名空间。

0
0 Comments

问题的原因是,当使用XmlDocument类创建XML文档时,如果要为根元素添加多个命名空间,设置命名空间属性会出现问题。在给定的示例中,使用了CreateElement和SetAttribute方法来添加命名空间属性,但是这种方法在某些情况下可能不起作用。

解决方法是使用CreateElement方法的重载形式,该方法接受三个参数:命名空间前缀、元素名称和命名空间URI。通过使用此重载形式,可以为根元素和子元素分别添加命名空间。

下面是解决问题的示例代码:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("JOBS");
root.SetAttribute("xmlns:JOBS", "http://www.example.com");
root.SetAttribute("xmlns:JOB", "http://www.example.com");
doc.AppendChild(root);
XmlElement job = doc.CreateElement("JOB");
XmlElement docInputs = doc.CreateElement("JOB", "DOCINPUTS", "http://www.example.com");
XmlElement docInput = doc.CreateElement("JOB", "DOCINPUT", "http://www.example.com");
docInputs.AppendChild(docInput);
job.AppendChild(docInputs);
XmlElement docOutputs = doc.CreateElement("JOB", "DOCOUTPUTS", "http://www.example.com");
XmlElement docOutput = doc.CreateElement("JOB", "DOCOUTPUT", "http://www.example.com");
docOutputs.AppendChild(docOutput);
job.AppendChild(docOutputs);
doc.DocumentElement.AppendChild(job);

这段代码将生成所请求的期望输出。通过使用CreateElement方法的重载形式,并为每个元素分别指定命名空间前缀和URI,可以正确地将多个命名空间添加到根元素。

然而,在给定的示例/期望输出中,使用相同的XML命名空间对应了两个不同的前缀,这是有点奇怪的。希望这能帮到你。

- 我同意,在示例中,父元素(JOBS)和子元素(JOB)都显式地声明了相同的命名空间,而只需为父元素声明命名空间就足够了。

应该足够的。但是当你与像国税局这样不正确地执行命名空间继承的固执组织进行接口交互时,就不起作用了。

0
0 Comments

问题的出现原因是在XmlDocument中如何将多个命名空间添加到根元素。解决方法是通过在元素上显式创建命名空间前缀属性。当添加具有相同命名空间和相同前缀的后代元素时,XmlDocument会判断不需要向元素添加命名空间声明。

下面是一个示例,演示了如何使用这种方法:

using System;
using System.Xml;
public class Program
{
    public static void Main(string[] args)
    {
        XmlDocument xmlDoc = new XmlDocument();
        // 创建根元素
        XmlElement rootElement = xmlDoc.CreateElement("root");
        xmlDoc.AppendChild(rootElement);
        // 为根元素添加命名空间前缀属性
        rootElement.SetAttribute("xmlns:a", "namespace1");
        rootElement.SetAttribute("xmlns:b", "namespace2");
        // 创建具有相同命名空间和相同前缀的后代元素
        XmlElement elementA = xmlDoc.CreateElement("a", "elementA", "namespace1");
        rootElement.AppendChild(elementA);
        XmlElement elementB = xmlDoc.CreateElement("b", "elementB", "namespace2");
        rootElement.AppendChild(elementB);
        // 保存并打印XML文档
        xmlDoc.Save(Console.Out);
        Console.ReadLine();
    }
}

运行上述代码,可以看到在根元素中成功添加了两个命名空间。

0