Skip to content

Commit 438cf13

Browse files
committed
修复 Release 文件读写的问题。 🐰
1 parent 87e18a3 commit 438cf13

File tree

3 files changed

+117
-87
lines changed

3 files changed

+117
-87
lines changed

upgrading/.shared/Release.Reader.cs

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ internal static Release Read(XmlReader reader)
111111
{
112112
ArgumentNullException.ThrowIfNull(reader);
113113

114+
if(reader.NodeType == XmlNodeType.None)
115+
reader.MoveToContent();
116+
114117
if(reader.NodeType != XmlNodeType.Element)
115118
return null;
116119
if(reader.LocalName != RELEASE_ELEMENT)
@@ -126,28 +129,28 @@ internal static Release Read(XmlReader reader)
126129
{
127130
switch(reader.LocalName)
128131
{
129-
case nameof(Release.Title):
130-
if(reader.Read() && reader.NodeType == XmlNodeType.Text)
132+
case TITLE_ELEMENT:
133+
if(reader.Read() && (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA))
131134
release.Title = reader.Value;
132135

133136
break;
134-
case nameof(Release.Summary):
135-
if(reader.Read() && reader.NodeType == XmlNodeType.Text)
137+
case SUMMARY_ELEMENT:
138+
if(reader.Read() && (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA))
136139
release.Summary = reader.Value;
137140

138141
break;
139-
case nameof(Release.Description):
140-
if(reader.Read() && reader.NodeType == XmlNodeType.Text)
142+
case DESCRIPTION_ELEMENT:
143+
if(reader.Read() && (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA))
141144
release.Description = reader.Value;
142145

143146
break;
144-
case nameof(TAGS_ELEMENT):
147+
case TAGS_ELEMENT:
145148
PopulateTags(release, reader);
146149
break;
147-
case nameof(EXECUTORS_ELEMENT):
150+
case EXECUTORS_ELEMENT:
148151
PopulateExecutors(release, reader);
149152
break;
150-
case nameof(PROPERTIES_ELEMENT):
153+
case PROPERTIES_ELEMENT:
151154
PopulateProperties(release, reader);
152155
break;
153156
}
@@ -167,6 +170,9 @@ internal static async ValueTask<Release> ReadAsync(XmlReader reader, Cancellatio
167170
{
168171
ArgumentNullException.ThrowIfNull(reader);
169172

173+
if(reader.NodeType == XmlNodeType.None)
174+
await reader.MoveToContentAsync();
175+
170176
if(reader.NodeType != XmlNodeType.Element)
171177
return null;
172178
if(reader.LocalName != RELEASE_ELEMENT)
@@ -182,28 +188,28 @@ internal static async ValueTask<Release> ReadAsync(XmlReader reader, Cancellatio
182188
{
183189
switch(reader.LocalName)
184190
{
185-
case nameof(Release.Title):
186-
if(await reader.ReadAsync() && reader.NodeType == XmlNodeType.Text)
191+
case TITLE_ELEMENT:
192+
if(await reader.ReadAsync() && (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA))
187193
release.Title = reader.Value;
188194

189195
break;
190-
case nameof(Release.Summary):
191-
if(await reader.ReadAsync() && reader.NodeType == XmlNodeType.Text)
196+
case SUMMARY_ELEMENT:
197+
if(await reader.ReadAsync() && (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA))
192198
release.Summary = reader.Value;
193199

194200
break;
195-
case nameof(Release.Description):
196-
if(await reader.ReadAsync() && reader.NodeType == XmlNodeType.Text)
201+
case DESCRIPTION_ELEMENT:
202+
if(await reader.ReadAsync() && (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA))
197203
release.Description = reader.Value;
198204

199205
break;
200-
case nameof(TAGS_ELEMENT):
206+
case TAGS_ELEMENT:
201207
PopulateTags(release, reader);
202208
break;
203-
case nameof(EXECUTORS_ELEMENT):
209+
case EXECUTORS_ELEMENT:
204210
PopulateExecutors(release, reader);
205211
break;
206-
case nameof(PROPERTIES_ELEMENT):
212+
case PROPERTIES_ELEMENT:
207213
PopulateProperties(release, reader);
208214
break;
209215
}
@@ -242,7 +248,10 @@ static void PopulateExecutors(Release release, XmlReader reader)
242248
var @event = reader.GetAttribute(EVENT_ATTRIBUTE);
243249

244250
if(string.IsNullOrWhiteSpace(@event))
251+
{
245252
reader.Skip();
253+
continue;
254+
}
246255

247256
if(reader.Read() && (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA))
248257
release.Executors.Add(new(@event, reader.Value));
@@ -261,7 +270,10 @@ static void PopulateProperties(Release release, XmlReader reader)
261270
var name = reader.GetAttribute(NAME_ATTRIBUTE);
262271

263272
if(string.IsNullOrWhiteSpace(name))
273+
{
264274
reader.Skip();
275+
continue;
276+
}
265277

266278
if(reader.Read() && (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA))
267279
{
@@ -284,44 +296,47 @@ static void PopulateAttributes(Release release, XmlReader reader)
284296

285297
switch(reader.LocalName)
286298
{
287-
case nameof(Release.Name):
299+
case NAME_ATTRIBUTE:
288300
release.Name = reader.Value;
289301
break;
290-
case nameof(Release.Kind):
302+
case KIND_ATTRIBUTE:
291303
release.Kind = Common.Convert.ConvertValue<ReleaseKind>(reader.Value);
292304
break;
293-
case nameof(Release.Title):
305+
case TITLE_ATTRIBUTE:
294306
release.Title = reader.Value;
295307
break;
296-
case nameof(Release.Edition):
308+
case EDITION_ATTRIBUTE:
297309
release.Edition = reader.Value;
298310
break;
299-
case nameof(Release.Version):
300-
release.Version = Version.Parse(reader.Value);
311+
case VERSION_ATTRIBUTE:
312+
release.Version = Version.TryParse(reader.Value, out var version) ? version : null;
301313
break;
302-
case nameof(Release.Size):
303-
release.Size = uint.Parse(reader.Value);
314+
case SIZE_ATTRIBUTE:
315+
release.Size = uint.TryParse(reader.Value, out var size) ? size : 0;
304316
break;
305-
case nameof(Release.Path):
317+
case PATH_ATTRIBUTE:
306318
release.Path = reader.Value;
307319
break;
308-
case nameof(Release.Checksum):
320+
case CHECKSUM_ATTRIBUTE:
309321
release.Checksum = Checksum.Parse(reader.Value);
310322
break;
311-
case nameof(Release.Platform):
323+
case PLATFORM_ATTRIBUTE:
312324
release.Platform = Common.Convert.ConvertValue<Platform>(reader.Value);
313325
break;
314-
case nameof(Release.Architecture):
326+
case ARCHITECTURE_ATTRIBUTE:
315327
release.Architecture = Common.Convert.ConvertValue<Architecture>(reader.Value);
316328
break;
317-
case nameof(Release.Deprecated):
318-
release.Deprecated = bool.Parse(reader.Value);
329+
case DEPRECATED_ATTRIBUTE:
330+
release.Deprecated = bool.TryParse(reader.Value, out var deprecated) && deprecated;
319331
break;
320-
case nameof(Release.Creation):
321-
release.Creation = DateTime.Parse(reader.Value);
332+
case CREATION_ATTRIBUTE:
333+
release.Creation = DateTime.TryParse(reader.Value, out var creation) ? creation : default;
322334
break;
323335
}
324336
}
337+
338+
if(reader.NodeType == XmlNodeType.Attribute)
339+
reader.MoveToElement();
325340
}
326341

327342
private static XmlReaderSettings GetSettings(bool asynchronous) => new()

upgrading/.shared/Release.Writer.cs

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,31 @@ partial class Release
4141
#region 私有常量
4242
private const string NAME_ATTRIBUTE = "name";
4343
private const string TYPE_ATTRIBUTE = "type";
44+
private const string KIND_ATTRIBUTE = "kind";
45+
private const string PATH_ATTRIBUTE = "path";
46+
private const string SIZE_ATTRIBUTE = "size";
4447
private const string EVENT_ATTRIBUTE = "event";
45-
46-
private const string TAG_ELEMENT = "Tag";
47-
private const string TAGS_ELEMENT = "Tags";
48-
private const string EXECUTOR_ELEMENT = "Executor";
49-
private const string EXECUTORS_ELEMENT = "Executors";
50-
private const string PROPERTY_ELEMENT = "Property";
51-
private const string PROPERTIES_ELEMENT = "Properties";
52-
private const string RELEASE_ELEMENT = "Release";
53-
private const string RELEASES_ELEMENT = "Releases";
48+
private const string TITLE_ATTRIBUTE = "title";
49+
private const string EDITION_ATTRIBUTE = "edition";
50+
private const string VERSION_ATTRIBUTE = "version";
51+
private const string CREATION_ATTRIBUTE = "creation";
52+
private const string CHECKSUM_ATTRIBUTE = "checksum";
53+
private const string PLATFORM_ATTRIBUTE = "platform";
54+
private const string DEPRECATED_ATTRIBUTE = "deprecated";
55+
private const string ARCHITECTURE_ATTRIBUTE = "architecture";
56+
57+
private const string TITLE_ELEMENT = "title";
58+
private const string SUMMARY_ELEMENT = "summary";
59+
private const string DESCRIPTION_ELEMENT = "description";
60+
61+
private const string TAG_ELEMENT = "tag";
62+
private const string TAGS_ELEMENT = "tags";
63+
private const string EXECUTOR_ELEMENT = "executor";
64+
private const string EXECUTORS_ELEMENT = "executors";
65+
private const string PROPERTY_ELEMENT = "property";
66+
private const string PROPERTIES_ELEMENT = "properties";
67+
private const string RELEASE_ELEMENT = "release";
68+
private const string RELEASES_ELEMENT = "releases";
5469
#endregion
5570

5671
#region 实例方法
@@ -91,35 +106,35 @@ private static void Write(XmlWriter writer, Release release)
91106

92107
writer.WriteStartElement(RELEASE_ELEMENT);
93108

94-
writer.WriteAttributeString(nameof(release.Name), release.Name);
95-
writer.WriteAttributeString(nameof(release.Kind), release.Kind.ToString());
96-
writer.WriteAttributeString(nameof(release.Edition), release.Edition);
97-
writer.WriteAttributeString(nameof(release.Version), release.Version.ToString());
98-
writer.WriteAttributeString(nameof(release.Size), release.Size.ToString());
99-
writer.WriteAttributeString(nameof(release.Path), release.Path);
100-
writer.WriteAttributeString(nameof(release.Checksum), release.Checksum.ToString());
101-
writer.WriteAttributeString(nameof(release.Platform), release.Platform.ToString());
102-
writer.WriteAttributeString(nameof(release.Architecture), release.Architecture.ToString());
103-
writer.WriteAttributeString(nameof(release.Deprecated), release.Deprecated.ToString());
104-
writer.WriteAttributeString(nameof(release.Creation), release.Creation.ToString());
109+
writer.WriteAttributeString(NAME_ATTRIBUTE, release.Name);
110+
writer.WriteAttributeString(KIND_ATTRIBUTE, release.Kind.ToString());
111+
writer.WriteAttributeString(EDITION_ATTRIBUTE, release.Edition);
112+
writer.WriteAttributeString(VERSION_ATTRIBUTE, release.Version.ToString());
113+
writer.WriteAttributeString(SIZE_ATTRIBUTE, release.Size.ToString());
114+
writer.WriteAttributeString(PATH_ATTRIBUTE, release.Path);
115+
writer.WriteAttributeString(CHECKSUM_ATTRIBUTE, release.Checksum.ToString());
116+
writer.WriteAttributeString(PLATFORM_ATTRIBUTE, release.Platform.ToString());
117+
writer.WriteAttributeString(ARCHITECTURE_ATTRIBUTE, release.Architecture.ToString());
118+
writer.WriteAttributeString(DEPRECATED_ATTRIBUTE, release.Deprecated.ToString());
119+
writer.WriteAttributeString(CREATION_ATTRIBUTE, release.Creation.ToString());
105120

106121
if(!string.IsNullOrWhiteSpace(release.Title))
107122
{
108-
writer.WriteStartElement(nameof(release.Title));
123+
writer.WriteStartElement(TITLE_ELEMENT);
109124
writer.WriteValue(release.Title);
110125
writer.WriteEndElement();
111126
}
112127

113128
if(!string.IsNullOrWhiteSpace(release.Summary))
114129
{
115-
writer.WriteStartElement(nameof(release.Summary));
130+
writer.WriteStartElement(SUMMARY_ELEMENT);
116131
writer.WriteValue(release.Summary);
117132
writer.WriteEndElement();
118133
}
119134

120135
if(!string.IsNullOrWhiteSpace(release.Description))
121136
{
122-
writer.WriteStartElement(nameof(release.Description));
137+
writer.WriteStartElement(DESCRIPTION_ELEMENT);
123138
writer.WriteValue(release.Description);
124139
writer.WriteEndElement();
125140
}

upgrading/README.md

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,39 +18,39 @@
1818
```xml
1919
<?xml version="1.0" encoding="UTF-8"?>
2020

21-
<Release
22-
Name="Zongsoft.Hosting.Terminal"
23-
Kind="Fully"
24-
Edition=""
25-
Version="1.1.0"
26-
Size="123456"
27-
Path="Zongsoft.Hosting.Terminal@1.1.0_win-x64"
28-
Checksum="SHA1:1234567890ABCDEF"
29-
Platform="Windows"
30-
Architecture="X64"
31-
Deprecated="false"
32-
Creation="2026-04-10T10:30:59">
33-
34-
<Title></Title>
35-
<Summary></Summary>
36-
<Description></Description>
37-
38-
<Tags>
39-
<Tag></Tag>
40-
</Tags>
41-
42-
<Properties>
43-
<Property name="" type="">
21+
<release
22+
name="Zongsoft.Hosting.Terminal"
23+
kind="Fully"
24+
edition=""
25+
version="1.1.0"
26+
size="123456"
27+
path="Zongsoft.Hosting.Terminal@1.1.0_win-x64.zip"
28+
checksum="SHA1:1234567890ABCDEF"
29+
platform="Windows"
30+
architecture="X64"
31+
deprecated="false"
32+
creation="2026-04-10T10:30:59">
33+
34+
<title></title>
35+
<summary></summary>
36+
<description></description>
37+
38+
<tags>
39+
<tag></tag>
40+
</tags>
41+
42+
<properties>
43+
<property name="" type="">
4444
<![CDATA[
4545
]]>
46-
</Property>
47-
</Properties>
46+
</property>
47+
</properties>
4848

49-
<Executors>
50-
<Executor event="">
49+
<executors>
50+
<executor event="">
5151
<![CDATA[
5252
]]>
53-
</Executor>
54-
</Executors>
55-
</Release>
53+
</executor>
54+
</executors>
55+
</release>
5656
```

0 commit comments

Comments
 (0)