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