Skip to content

Commit 97592df

Browse files
committed
can get element contents
1 parent 67becfc commit 97592df

File tree

4 files changed

+122
-1
lines changed

4 files changed

+122
-1
lines changed

src/DocumentFormat.OpenXml.Framework/OpenXmlPartReader.cs

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,14 +400,120 @@ public override void Skip()
400400
#region Async methods
401401
#if TASKS_SUPPORTED
402402
public override Task<bool> ReadAsync()
403+
{
404+
return _xmlReader.ReadAsync();
405+
}
406+
407+
public override Task<string> GetValueAsync()
403408
{
404409
ThrowIfObjectDisposed();
405410

411+
return _xmlReader.GetValueAsync();
412+
}
406413

407-
return _xmlReader.ReadAsync();
414+
public async override Task<bool> ReadFirstChildAsync()
415+
{
416+
ThrowIfObjectDisposed();
417+
418+
bool result = await MoveToFirstChildAsync().ConfigureAwait(true);
419+
420+
if (result && !ReadMiscNodes)
421+
{
422+
// skip miscellaneous node
423+
while (result && IsMiscNode)
424+
{
425+
result = MoveToNextSibling();
426+
}
427+
}
428+
429+
return result;
430+
}
431+
432+
private async Task<bool> MoveToFirstChildAsync()
433+
{
434+
switch (_elementState)
435+
{
436+
case ElementState.EOF:
437+
return false;
438+
439+
case ElementState.Start:
440+
if (!(await _xmlReader.ReadAsync().ConfigureAwait(true)))
441+
{
442+
// should can read.
443+
Debug.Assert(false);
444+
return false;
445+
}
446+
447+
GetElementInformation();
448+
if (_elementState == ElementState.End)
449+
{
450+
return false;
451+
}
452+
453+
return true;
454+
455+
case ElementState.LeafStart:
456+
_elementState = ElementState.LeafEnd;
457+
return false;
458+
459+
case ElementState.End:
460+
case ElementState.LeafEnd:
461+
case ElementState.LoadEnd:
462+
case ElementState.MiscNode:
463+
return false;
464+
465+
case ElementState.Null:
466+
ThrowIfNull();
467+
break;
468+
469+
default:
470+
break;
471+
}
472+
473+
return false;
474+
}
475+
476+
private async Task InnerSkipAsync()
477+
{
478+
switch (_elementState)
479+
{
480+
case ElementState.Null:
481+
ThrowIfNull();
482+
break;
483+
484+
case ElementState.EOF:
485+
return;
486+
487+
case ElementState.Start:
488+
case ElementState.End:
489+
case ElementState.MiscNode:
490+
_xmlReader.Skip();
491+
_elementStack.Pop();
492+
GetElementInformation();
493+
return;
494+
495+
case ElementState.LeafStart:
496+
// no move, just process cursor
497+
_elementStack.Pop();
498+
GetElementInformation();
499+
return;
500+
501+
case ElementState.LeafEnd:
502+
case ElementState.LoadEnd:
503+
// cursor is leaf element, pop stack, no move
504+
_elementStack.Pop();
505+
GetElementInformation();
506+
return;
507+
508+
default:
509+
break;
510+
}
511+
512+
return;
408513
}
409514
#endif
410515
#endregion
516+
411517
#region private methods
412518

413519
/// <summary>

src/DocumentFormat.OpenXml.Framework/OpenXmlReader.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,16 @@ public virtual Task<bool> ReadAsync()
256256
{
257257
return Task.FromResult(Read());
258258
}
259+
260+
public virtual Task<string> GetValueAsync()
261+
{
262+
return Task.FromResult(GetText());
263+
}
264+
265+
public virtual Task<bool> ReadFirstChildAsync()
266+
{
267+
return Task.FromResult(ReadFirstChild());
268+
}
259269
#endregion
260270
#endif
261271

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#nullable enable
22
DocumentFormat.OpenXml.OpenXmlPartReaderOptions.Async.get -> bool
33
DocumentFormat.OpenXml.OpenXmlPartReaderOptions.Async.set -> void
4+
override DocumentFormat.OpenXml.OpenXmlPartReader.GetValueAsync() -> System.Threading.Tasks.Task<string!>!
45
override DocumentFormat.OpenXml.OpenXmlPartReader.ReadAsync() -> System.Threading.Tasks.Task<bool>!
6+
virtual DocumentFormat.OpenXml.OpenXmlReader.GetValueAsync() -> System.Threading.Tasks.Task<string!>!
57
virtual DocumentFormat.OpenXml.OpenXmlReader.ReadAsync() -> System.Threading.Tasks.Task<bool>!
8+
virtual DocumentFormat.OpenXml.OpenXmlReader.ReadFirstChildAsync() -> System.Threading.Tasks.Task<bool>!

src/DocumentFormat.OpenXml.Framework/XmlConvertingReader.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ protected override void Dispose(bool disposing)
5858

5959
#if TASKS_SUPPORTED
6060
public override Task<bool> ReadAsync() => BaseReader.ReadAsync();
61+
62+
public override Task<string> GetValueAsync() => BaseReader.GetValueAsync();
6163
#endif
6264

6365
/// <inheritdoc/>

0 commit comments

Comments
 (0)