以非常具体的方式生成Xml 我有特定的xml文件,我需要能够采用符合它们的c#类/代码(读写)。而不是相反。我知道我可以做一些技巧,比如首先打开文件、替换根名称等等,但我想学习如何使用xml覆盖或在类中或数组中正确使用的其他xml配置/标识符主题来编写

以非常具体的方式生成Xml 我有特定的xml文件,我需要能够采用符合它们的c#类/代码(读写)。而不是相反。我知道我可以做一些技巧,比如首先打开文件、替换根名称等等,但我想学习如何使用xml覆盖或在类中或数组中正确使用的其他xml配置/标识符主题来编写,c#,xml,C#,Xml,我试着用xml覆盖做一些事情,但做不好 生成输出的示例代码 下面是一个示例代码: public class TestXml { public TestXmlElement[] testXmlArray = new TestXmlElement[] { new TestXmlElement(),new TestXmlElement() }; public TestXml() { } } public class TestXmlElement

我试着用xml覆盖做一些事情,但做不好

生成输出的示例代码

下面是一个示例代码:

 public class TestXml
    {
        public TestXmlElement[] testXmlArray = new TestXmlElement[] { new TestXmlElement(),new TestXmlElement() };
        public TestXml() { }
    }
    public class TestXmlElement
    {
        [XmlAttribute]
        public string Name = "default";
        [XmlAttribute]
        public ulong Value = 1;
        public TestXmlElement() { }
    }

    class Program
    {
        static void Main(string[] args)
        {
            TestXml tx=new TestXml();
            StreamWriter sw=new StreamWriter(@"g:\test_class.xml");
            XmlSerializer x = new XmlSerializer(typeof(TestXml));
            x.Serialize(sw.BaseStream, tx);
            sw.Close();

            TestXmlElement[] txa = new TestXmlElement[] { new TestXmlElement(),new TestXmlElement() };
            sw = new StreamWriter(@"g:\test_array.xml");
            x = new XmlSerializer(typeof(TestXmlElement[]));
            x.Serialize(sw.BaseStream, txa);
            sw.Close();
        }
    }
输出

这就是test_class.xml中的内容

<?xml version="1.0"?>
<TestXml>
  <testXmlArray>
    <TestXmlElement Name="default" Value="1" />
    <TestXmlElement Name="default" Value="1" />
  </testXmlArray>
</TestXml>

这就是test_array.xml中的内容

<?xml version="1.0"?>
<ArrayOfTestXmlElement>
  <TestXmlElement Name="default" Value="1" />
  <TestXmlElement Name="default" Value="1" />
</ArrayOfTestXmlElement>

预期产出

这就是我需要的(如果类使用,则不带数组层;如果编写数组本身,则不带重写的数组标识符): (如果类case中没有数组层,那么我可以正确命名该类。编写该类的问题是的额外层)


您可以将
TestXml
类创建为
IList
实现:

[XmlRoot(ElementName = "SOME_OVERRIDDEN_NAME")]
public class TestXml : IList<TestXmlElement>
{
    private List<TestXmlElement> _innerList = new List<TestXmlElement>();
    public TestXmlElement this[int index] { get => _innerList[index]; set => _innerList[index] = value; }
    public int Count => _innerList.Count;
    public bool IsReadOnly => false;

    -- snip rest of IList members
}
结果:

<?xml version="1.0"?>
<SOME_OVERRIDDEN_NAME xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TestXmlElement Name="default" Value="1" />
  <TestXmlElement Name="default" Value="1" />
</SOME_OVERRIDDEN_NAME>


我不清楚,你能清楚地提供你的输入、你得到的输出和预期的输出吗?好的,好的!添加了一些粗体文本来分隔它们…当XML序列化数组时,网络库将自动创建两层XML标记。为了消除需要在数组上方添加的额外标记:[xmlement(“testxmlement”)],我还将在这里添加jdweng的答案,因为它完成了这项工作。两个答案都很好。当XML序列化数组时,网络库将自动创建两层XML标记。要消除额外的标记,需要在数组上方添加:[XmlElement(“TestXmlElement”)]
class Program
{
    static void Main(string[] args)
    {
        TestXml tx = new TestXml();
        tx.Add(new TestXmlElement());
        tx.Add(new TestXmlElement());
        StreamWriter sw = new StreamWriter(@"c:\temp\testproj\test_class.xml");
        XmlSerializer x = new XmlSerializer(typeof(TestXml));
        x.Serialize(sw.BaseStream, tx);
        sw.Close();
    }
}
<?xml version="1.0"?>
<SOME_OVERRIDDEN_NAME xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TestXmlElement Name="default" Value="1" />
  <TestXmlElement Name="default" Value="1" />
</SOME_OVERRIDDEN_NAME>