Изменение структуры XML, созданной XmlSerializer в C # - PullRequest
3 голосов
/ 16 февраля 2011

У меня есть классы следующим образом

namespace Coverage {
    public class ClassInfo {
        public string ClassName;
        public int BlocksCovered;
        public int BlocksNotCovered;

        public ClassInfo() {}

        public ClassInfo(string ClassName, int BlocksCovered, int BlocksNotCovered) 
        {
            this.ClassName = ClassName;
            this.BlocksCovered = BlocksCovered;
            this.BlocksNotCovered = BlocksNotCovered;
        }
    }

    public class Module {
        public List<ClassInfo> ClassInfoList;
        public int BlocksCovered;
        public int BlocksNotCovered;
        public string moduleName;

        public Module()
        {
            ClassInfoList = new List<ClassInfo>();
            BlocksCovered = 0;
            BlocksNotCovered = 0;
            moduleName = "";
        }

со следующим кодом сериализатора

XmlSerializer SerializerObj = new XmlSerializer(typeof(Module));
// Create a new file stream to write the serialized object to a file
TextWriter WriteFileStream = new StreamWriter(@"test.xml");
SerializerObj.Serialize(WriteFileStream, report);
WriteFileStream.Close();

Я могу получить следующий XML-файл.

<?xml version="1.0" encoding="utf-8"?>
<Module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ClassInfoList>
    <ClassInfo>
      <ClassName>Fpga::TestMe</ClassName>
      <BlocksCovered>4</BlocksCovered>
      <BlocksNotCovered>8</BlocksNotCovered>
    </ClassInfo>
    <ClassInfo>
      <ClassName>Fpga::TestMe2</ClassName>
      <BlocksCovered>4</BlocksCovered>
      <BlocksNotCovered>8</BlocksNotCovered>
    </ClassInfo>
  </ClassInfoList>
  <BlocksCovered>8</BlocksCovered>
  <BlocksNotCovered>16</BlocksNotCovered>
  <moduleName>helloclass.exe</moduleName>
</Module>
  • Q1: Как я могу удалить xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://..., чтобы иметь простой элемент <Module>..</Module>?
  • Q2: имя элемента XML точно такое же, как имя класса или имя переменной. Могу ли я заменить его своим собственным?
  • Q3: Можно ли удалить внешнюю <ClassInfoList>?

Например, как я могу сгенерировать XML следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Module>
  <Class>
      <ClassName>Fpga::TestMe</ClassName>
      <BlocksCovered>4</BlocksCovered>
      <BlocksNotCovered>8</BlocksNotCovered>
  </Class>
  <Class>
      <ClassName>Fpga::TestMe2</ClassName>
      <BlocksCovered>4</BlocksCovered>
      <BlocksNotCovered>8</BlocksNotCovered>
  </Class>
  <BlocksCovered>8</BlocksCovered>
  <BlocksNotCovered>16</BlocksNotCovered>
  <moduleName>helloclass.exe</moduleName>
</Module>

1 Ответ

13 голосов
/ 16 февраля 2011

(кстати, это не связано с вопросом, но вы должны стремиться избегать открытых полей, по многим причинам, рассматриваемым во многих вопросах stackoverflow)

Q3: просто:

[XmlElement("Class")]
public List<ClassInfo> ClassInfoList;

Q2 re название верхнего уровня; Вы можете использовать

[XmlRoot("somethingFun")]
public class Module { ... }

Q2 re имена членов:

[XmlElement("blocks")]
public int BlocksCovered;

(см. Также [XmlAttribute(...)])

Q1 Удаление xsi и т. Д. Можно выполнить с помощью XmlSerializerNamespaces:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
var ser = new XmlSerializer(typeof(Module));
ser.Serialize(destination, module, ns);
...