У меня проблема с созданием соответствующего класса для десериализации файла xml. Структура xml выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="pl" datatype="plaintext" original="1112">
<body>
<group id="90362">
<trans-unit id="90362::aff_11">
<source>text 1 1</source>
<target>text 1 1</target>
</trans-unit>
<trans-unit id="90362::aff_12">
<source>text 1 2</source>
<target>text 1 2</target>
</trans-unit>
<trans-unit id="90362::aff_13">
<source>text 1 3</source>
<target>text 1 3</target>
</trans-unit>
</group>
<group id="90392">
<trans-unit id="90392::aff_21">
<source>text 2 1</source>
<target>text 2 1</target>
</trans-unit>
<trans-unit id="90392::aff_22">
<source>text 2 2</source>
<target>text 2 2</target>
</trans-unit>
<trans-unit id="90392::aff_23">
<source>text 2 3</source>
<target>text 2 3</target>
</trans-unit>
</group>
</body>
</file>
</xliff>
Как видите, у нас есть вложенные массивы внутри массивов. Кроме того, один из массивов имеет имя, которое нельзя назвать таким же именем для класса. Предварительно созданные классы:
[XmlRoot("xliff", Namespace = "urn:oasis:names:tc:xliff:document:1.2")]
public class xliff
{
public file file { get; set; }
}
public class file
{
public body body { get; set; }
}
public class body : List<group>
{
public List<group> groups { get; set; }
}
public class group //: List<trans>
{
public List<trans> trans { get; set; }
}
public class trans
{
[XmlElement("source")]
public string source { get; set; }
[XmlElement("target")]
public string target { get; set; }
}
К сожалению, у меня есть проблема с завершением классов, чтобы получить исходные и целевые значения.
3 ответа
XLIFF намного сложнее и имеет гораздо больше элементов, чем этот. Текущая версия — 2.1, но более старая версия 1.2 также описана в сайт OASIS вместе с ссылки на схему XSD
Почти все стандартизированные документы XML основаны на схеме XML, доступной в виде документа XSD (определение схемы XML).
Вы можете использовать инструмент xsd.exe
для создания классов C# из файла XSD. Вы можете загрузить, например, http://docs.oasis-open.org/xliff/v1.2/cs02/xliff-core-1.2-strict.xsd
локально как xliff.xsd
, а затем выполнить
xsd xliff.xsd /c
Чтобы сгенерировать файл xliff.cs
со всеми классами.
В результате получается более 1000 строк, поэтому его нельзя просто вставить сюда.
древовидная структура, скопированная из документы, содержит много элементов:
<xliff>1
| |
| +--- [Extension Point]
| |
+--- <file>+
|
+--- <header>?
| |
| +--- <skl>?
| | |
| | +--- (<internal-file> | <external-file>)1
| |
| +--- <phase-group>?
| | |
| | +--- <phase>+
| | |
| | +--- <note>*
| |
| +--- <glossary>*
| | |
| | +--- (<internal-file> | <external-file>)1
| |
| +--- <reference>*
| | |
| | +--- (<internal-file> | <external-file>)1
| |
| +--- <count-group>*
| | |
| | +--- <count>*
| |
| +--- <tool>*
| | |
| | +--- [Extension Point]
| |
| +--- <prop-group>*
| | |
| | +--- <prop>*
| |
| +--- [Extension Point]
| |
| +--- <note>*
|
+--- <body>1
|
+--- <group>*
| |
| +--- <context-group>*
| | |
| | +--- <context>+
| |
| +--- <count-group>*
| | |
| | +--- <count>*
| |
| +--- <prop-group>*
| | |
| | +--- <prop>*
| |
| +--- [Extension Point]
| |
| +--- <note>*
| |
| +--- At least one of: (<group>* <trans-unit>* <bin-unit>*)
|
+--- <trans-unit>*
| |
| +--- <source>1
| | |
| | +--- [Inline Elements]
| |
| +--- <target>?
| | |
| | +--- [Inline Elements]
| |
| +--- <context-group>*
| | |
| | +--- <context>+
| |
| +--- <count-group>*
| | |
| | +--- <count>*
| |
| +--- <prop-group>*
| | |
| | +--- <prop>*
| |
| +--- <seg-source>?
| | |
| | +--- [Inline Elements]
| |
| +--- [Extension Point]
| |
| +--- <note>*
| |
| +--- <alt-trans>*
| |
| +--- <context-group>*
| | |
| | +--- <context>+
| |
| +--- <source>?
| | |
| | +--- [Inline Elements]
| | | +--- <target>+
| | |
| | +--- [Inline Elements]
| |
| +--- <prop-group>*
| | |
| | +--- <prop>*
| |
| +--- <seg-source>?
| | |
| | +--- [Inline Elements]
| |
| +--- [Extension Point]
| |
| +---- <note>*
|
+--- <bin-unit>*
|
+--- <bin-source>1 & <bin-target>?
| |
| +--- (<internal-file> | <external-file>)1
|
+--- <context-group>*
| |
| +--- <context>+
|
+--- <count-group>*
| |
| +--- <count>*
|
+--- <prop-group>*
| |
| +--- <prop>*
|
+--- [Extension Point]
|
+--- <note>*
|
+--- <trans-unit>*
Struct_Extension_Elements
Inline Elements:
---+--- <ph>*
| |
| +--- <sub>*
| |
| +--- [Inline Elements]
|
+--- <it>*
| |
| +--- <sub>*
| |
| +--- [Inline Elements]
|
+--- <bpt>*
| |
| +--- <sub>*
| |
| +--- [Inline Elements]
|
+--- <ept>*
| |
| +--- <sub>*
| |
| +--- [Inline Elements]
|
+--- <g>*
| |
| +--- [Inline Elements]
|
+--- <x/>*
| |
| +--- [Inline Elements]
|
+--- <bx/>*
| |
| +--- [Inline Elements]
|
+--- <ex/>*
| |
| +--- [Inline Elements]
|
+--- <mrk>*
|
+--- [Inline Elements]
Вы можете использовать онлайн-инструмент для преобразования XML в модель C#: https://json2csharp.com/xml-to -csharp
Попробуйте использовать эту модель (созданную вышеуказанным инструментом):
// using System.Xml.Serialization;
// XmlSerializer serializer = new XmlSerializer(typeof(Xliff));
// using (StringReader reader = new StringReader(xml))
// {
// var test = (Xliff)serializer.Deserialize(reader);
// }
[XmlRoot(ElementName="trans-unit")]
public class Transunit {
[XmlElement(ElementName="source")]
public string Source { get; set; }
[XmlElement(ElementName="target")]
public string Target { get; set; }
[XmlAttribute(AttributeName="id")]
public string Id { get; set; }
[XmlText]
public string Text { get; set; }
}
[XmlRoot(ElementName="group")]
public class Group {
[XmlElement(ElementName="transunit")]
public List<Transunit> Transunit { get; set; }
[XmlAttribute(AttributeName="id")]
public int Id { get; set; }
[XmlText]
public string Text { get; set; }
}
[XmlRoot(ElementName="body")]
public class Body {
[XmlElement(ElementName="group")]
public List<Group> Group { get; set; }
}
[XmlRoot(ElementName="file")]
public class File {
[XmlElement(ElementName="body")]
public Body Body { get; set; }
[XmlAttribute(AttributeName="source-language")]
public string SourceLanguage { get; set; }
[XmlAttribute(AttributeName="target-language")]
public string TargetLanguage { get; set; }
[XmlAttribute(AttributeName="datatype")]
public string Datatype { get; set; }
[XmlAttribute(AttributeName="original")]
public int Original { get; set; }
[XmlText]
public string Text { get; set; }
}
[XmlRoot(ElementName="xliff")]
public class Xliff {
[XmlElement(ElementName="file")]
public File File { get; set; }
[XmlAttribute(AttributeName="version")]
public DateTime Version { get; set; }
[XmlAttribute(AttributeName="xmlns")]
public string Xmlns { get; set; }
[XmlText]
public string Text { get; set; }
}
вы не должны наследовать от List<T>
. Вместо этого вы выбрали композицию вместо наследования, что означает, что ваш body
-класс имеет набор групп, в отличие от вашего body
-класса, являющегося таким набором.
Таким образом, вы можете использовать эту структуру вместо этого:
[XmlRoot("xliff", Namespace = "urn:oasis:names:tc:xliff:document:1.2")]
public class xliff
{
public file file { get; set; }
}
public class file
{
public body body { get; set; }
}
public class body
{
[XmlElement("group")]
public List<group> groups { get; set; }
}
public class group
{
[XmlElement("trans")]
public List<trans> trans { get; set; }
}
public class trans
{
[XmlElement("source")]
public string source { get; set; }
[XmlElement("target")]
public string target { get; set; }
}
Кроме того, вы должны рассмотреть возможность использования PascalCase для своих классов. Чтобы дать этим классам разные имена в сериализованном xml, вы можете использовать xml-атрибуты, например:
[XmlRott("body")]
public class Body
xsd.exe
, содержит более 1000 строк.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.
I have a problem to complete classes to get to and values.
какая проблема? Помимо попыток использовать устаревший формат 1.2 вместо текущего 2.x. Как вы создавали классы? Я вижу, что XSD для XLIFF 1.2 a> доступен, поэтому вы должны иметь возможность создавать классы, используяxsd.exe
илиsvcutil.exe
, или инструмент генерации классов с открытым исходным кодомList<T>
. Вместо этого предпочли композицию наследованию, что означает, что вашbody
-класс имеет набор групп, в отличие от вашегоbody
-класса являющегося таким коллекция