Vielen dank für die Hinweise.
Dann werde ich das Ticket beobachten und wenn es kommt den Code anpassen.
Und das mit dem "stackalloc" ist auch sehr interessant. Auch dafür vielen Dank.
Ich denke ich habe nun die Lösung gefunden, nachdem ich in den Sourcecode angeschaut habe.
Man muss z.B.
Span<Range> ranges = new Range[] { Range.All, Range.All };
verwenden. Dann befüllt er auch beide.
Hallo zusammen,
ich wollte gerade auf einem ReadOnlySpan<char> Split aufrufen. Jedoch bekommen ich immer für count 0 zurück
ReadOnlySpan<char> toSplit = "Hallo Welt";
Span<Range> ranges = new Span<Range>();
var count = toSplit.Split(ranges, ' ');
Leider sehe ich nicht was ich falsch mache. Bei IndexOf gibt er mir für ' ' die richtige Position.
Schöne Grüße und vielen Dank
Permutation
Den Artikel hab ich auf https://stackoverflow.com/a/2583969 auch gefunden. Im ersten Kommentar ist eigentlich auch mein Problem beschrieben. Aber eben leider keine Lösung gesehen. Bzw. gehofft, dass sich in der Zwischenzeit evtl. was geändert hat.
EDIT:
Aber den zweiten Artikel kannte ich noch nicht. Schade, dann ist das eventuell wirklich nicht möglich.
Da ich jedoch die XSD parse kann ich auf solche Dinge reagieren und muss dann "Zwischenobjekte" anlegen analog wie in dem Artikel. Ich hatte gehofft dies vermeiden zu können um Zeit und Speicher zu sparen...
Aber vielen vielen Dank für Deine Zeit und Hinweise.
Ja genau ich brauch die Reihenfolge, da ich bei der Verarbeitung ja wissen muss was z.B. in <A>...</A> stand.
Ein RoundTrip ist so auch nicht möglich, da er beim Serialisieren dann einen Fehler wirft. Lasse ich es wie es ursprünglich war (mit dem Text Property), dann kommt folgendes raus:
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<A>a</A>
<B>b</B>
<C>c</C>
<A>aa</A>
<B>bb</B>
<C>cc</C>abc</Root>
D.h. beide "Lösungen" bringen mich leider nicht weiter, da "Wissen" verloren geht.
Und gibst du das Schema beim Deserialisieren mit (denn dort ist ja
Text
nicht definiert)?
Nein das gebe ich nicht mit an. Das Text
und Items
Property sind beide nicht im Schema, werden aber über die Attribute richtig "gesteuert".
Dann kommt liest er den "mixed" Inhalt nicht mehr und kommt z.B. in das Event
private static void XmlSerializer_UnknownNode(object? sender, XmlNodeEventArgs e)
{
throw new NotImplementedException();
}
mit
Name | Wert | Typ | |
---|---|---|---|
◢ | e | {System.Xml.Serialization.XmlNodeEventArgs} | System.Xml.Serialization.XmlNodeEventArgs |
LineNumber | 2 | int | |
LinePosition | 9 | int | |
LocalName | "#text" | string | |
Name | "#text" | string | |
NamespaceURI | "" | string | |
NodeType | Text | System.Xml.XmlNodeType | |
▶ ObjectBeingDeserialized | {XSDTest.Misc.Choice} | object {XSDTest.Misc.Choice} | |
Text | "a" | string |
EDIT:
mit "#text" hab ich es auch schon probiert.
Hallo zusammen,
ich habe eine Frage zum Serialisieren. Dazu ein kleines Beispiel:
Dies ist das Schema für eine XML Datei die gelesen werden soll:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:complexType abstract="false" mixed="true" name="Choice">
<xsd:choice maxOccurs="unbounded" minOccurs="0">
<xsd:element name="A" type="xsd:string"/>
<xsd:element name="B" type="xsd:string"/>
<xsd:element name="C" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
<xsd:element name="Root" type="Choice"/>
</xsd:schema>
Und hier die XML dazu:
<?xml version="1.0" encoding="utf-8"?>
<Root>a<A>a</A>b<B>b</B>c<C>c</C><A>aa</A><B>bb</B><C>cc</C></Root>
Wenn ich nun z.B. mit dem Tool xsd.exe mir Code erzeuge bekomme ich folgendes:
using System.Xml.Serialization;
namespace XSDTest.Misc {
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[Serializable()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlRoot("Root", Namespace="", IsNullable=false)]
public partial class Choice {
/// <remarks/>
[XmlText(typeof(string))]
[XmlElement("A", typeof(string))]
[XmlElement("B", typeof(string))]
[XmlElement("C", typeof(string))]
[XmlChoiceIdentifier("ItemsElementName")]
public string[] Items;
/// <remarks/>
[XmlElement("ItemsElementName")]
[XmlIgnore()]
public ItemsChoiceType[] ItemsElementName;
///// <remarks/>
//[System.Xml.Serialization.XmlTextAttribute()]
//public string[] Text;
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[Serializable()]
[XmlType(IncludeInSchema=false)]
public enum ItemsChoiceType {
/// <remarks/>
A,
/// <remarks/>
B,
/// <remarks/>
C,
}
}
Ich habe nachträglich das Text Property entfernt und XmlText(typeof(string))]
bei Items hinzugefügt, damit ich es "richtig" lesen kann. Nun habe ich aber das Problem, dass ich folgendes Resultat bekomme:
Name | Wert | Typ | |
---|---|---|---|
◢ | Items | {string[9]} | string[] |
[0] | "a" | string | |
[1] | "a" | string | |
[2] | "b" | string | |
[3] | "b" | string | |
[4] | "c" | string | |
[5] | "c" | string | |
[6] | "aa" | string | |
[7] | "bb" | string | |
[8] | "cc" | string | |
◢ | ItemsElementName | {XSDTest.Misc.ItemsChoiceType[6]} | XSDTest.Misc.ItemsChoiceType[] |
[0] | A | XSDTest.Misc.ItemsChoiceType | |
[1] | B | XSDTest.Misc.ItemsChoiceType | |
[2] | C | XSDTest.Misc.ItemsChoiceType | |
[3] | A | XSDTest.Misc.ItemsChoiceType | |
[4] | B | XSDTest.Misc.ItemsChoiceType | |
[5] | C | XSDTest.Misc.ItemsChoiceType |
Mit diesem Ergebnis kann ich leider nicht viel Anfangen, ich hab schon probiert, den Enum zu erweitern, damit ich bei ItemsElementName die selbe Anzahl bekomme wie bei Items.
z.B.
[XmlType(IncludeInSchema=false)]
public enum ItemsChoiceType {
// -------------
None,
[System.Xml.Serialization.XmlEnum("#text")]
Text,
// ------------
/// <remarks/>
A,
/// <remarks/>
B,
/// <remarks/>
C,
}
Leider hat bisher nichts funktioniert. Daher meine Frage, wie kann ich den Enum ItemsChoiceType
so erweitern, dass ItemsElementName auch 9 Einträge hat, oder muss ich es ganz anders machen?
Viele Grüße und vielen Dank
Quaneu
Update:
Ich konnte die Fehler jetzt "lösen", bzw. kommen sie nicht mehr. Aber leider zeigt mir der AssemblyResolver trotzdem noch .Net Framework an 😦
Auf github habe ich die Lösung gefunden. Also wenn ich auf dem "refs" Ordner nur noch die ""netstandard.dll" kommen keine Fehler mehr. Bleibt noch das ".Net Framework" Problem...
Einen ähnlichen Artikel habe ich auch schon gefunden, aber diese Lösung bezieht sich wohl nur auf "Console Application" und nicht auf "Class Library". Aber ich kann es mal probieren.
Edit1:
Also habe jetzt mal die Datei neben die generierte dll geleget, aber leider bringt das auch nichts.
Edit2:
Bild aus ILSpy.
Hier mein Code:
private static CSharpCompilation CreateCompileUnit(string dllName, NamespaceDeclarationSyntax namespaceDeclaration)
{
CompilationUnitSyntax compileUnit = SyntaxHelper.BuildCompilationUnit(namespaceDeclaration);
string sourceCodeAsText = compileUnit.NormalizeWhitespace("\t", Environment.NewLine).ToFullString();
SyntaxTree tree = CSharpSyntaxTree.ParseText(sourceCodeAsText);
SyntaxTree[] trees = { tree };
CSharpCompilationOptions compilerOptions = new CSharpCompilationOptions(
OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Debug, platform: Platform.X64);
var coreDir = Path.GetDirectoryName(typeof(object).GetTypeInfo().Assembly.Location);
MetadataReference[] reference =
{
MetadataReference.CreateFromFile(Path.Combine(coreDir, "System.Private.CoreLib.dll")),
MetadataReference.CreateFromFile(Path.Combine(coreDir, "System.Private.Xml.dll")),
MetadataReference.CreateFromFile(Path.Combine(coreDir, "System.Private.Uri.dll")),
MetadataReference.CreateFromFile(Path.Combine(coreDir, "System.Runtime.dll")),
MetadataReference.CreateFromFile(Path.Combine(coreDir, "System.Runtime.Extensions.dll")),
MetadataReference.CreateFromFile(Path.Combine(coreDir, "System.Xml.ReaderWriter.dll")),
MetadataReference.CreateFromFile(Path.Combine(coreDir, "System.Text.RegularExpressions.dll"))
};
CSharpCompilation compilation = CSharpCompilation.Create(dllName, trees, reference, compilerOptions);
return compilation;
}