Laden...
Quaneu
myCSharp.de - Member
175
Themen
692
Beiträge
Letzte Aktivität
vor 10 Monaten
Dabei seit
22.10.2008
Herkunft
Regensburg
Erstellt vor 10 Monaten

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.

Erstellt vor 10 Monaten

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.

Erstellt vor 10 Monaten

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

Erstellt vor einem Jahr

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.

Erstellt vor einem Jahr

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 Textund ItemsProperty sind beide nicht im Schema, werden aber über die Attribute richtig "gesteuert".

Erstellt vor einem Jahr

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.

Erstellt vor einem Jahr

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

Erstellt vor 4 Jahren

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&quot; Ordner nur noch die ""netstandard.dll" kommen keine Fehler mehr. Bleibt noch das ".Net Framework" Problem...

Erstellt vor 4 Jahren

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.

Erstellt vor 4 Jahren

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;
}

10 von 692 Beiträgen