2017-03-15 4 views
0

Ich versuche, eine einfache Webanwendung in ASP.NET Framework 4.5.2 (in Visual Studio 2013) zu erstellen. Ich möchte Inhalte aus einer XML-Datei lesen, den Inhalt in einem Schema überprüfen, auf der Seite default.aspx anzeigen und später Schaltflächen hinzufügen, um diese Inhalte zu bearbeiten und die Änderungen in die XML-Datei zu schreiben. Die Probleme, die ich habe, ist, dass ich nicht einmal herausfinden kann, wie man den Inhalt in einer ListView anzeigt (was meiner Suche zufolge eine geeignete Wahl der Kontrolle ist).Anzeigen von XML-Inhalt auf ASP.NET-Seite

In den Default.aspx.cs im Page_Load-Methode (? Dann ist dies der richtige Ort für sie), ich habe folgendes getan:

XDocument document = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "/App_Data/orders.xml"); 
     XmlSchemaSet schemas = new XmlSchemaSet(); 
     schemas.Add("", XmlReader.Create(AppDomain.CurrentDomain.BaseDirectory + "/App_Data/orderschema.xsd")); 
     bool errors = false; 

     document.Validate(schemas, (o, err) => 
     { 
      System.Diagnostics.Debug.WriteLine("Validation error: {0}", err.Message); 
      errors = true; 
     }); 

     if (!errors) 
     { 
      System.Diagnostics.Debug.WriteLine("XML document successfully validated."); 

     } 
     else 
     { 
      System.Diagnostics.Debug.WriteLine("XML document does not validate."); 
     } 

Diese gut zu funktionieren scheint. Das geladene Dokument scheint erfolgreich validiert worden zu sein, und wenn ich einen Fehler in der XML-Datei mache, schlägt die Validierung fehl.

Die XML-Datei sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8" ?> 

<shiporder orderid="889923"> 
    <orderperson>John Smith</orderperson> 
    <shipto> 
    <name>Ola Nordmann</name> 
    <address>Langgt 23</address> 
    <city>4000 Stavanger</city> 
    <country>Norway</country> 
    </shipto> 
    <item> 
    <title>Empire Burlesque</title> 
    <note>Special Edition</note> 
    <quantity>1</quantity> 
    <price>10.90</price> 
    </item> 
    <item> 
    <title>Hide your heart</title> 
    <quantity>1</quantity> 
    <!--Change to "one" to see validation error--> 
    <price>9.90</price> 
    </item> 
</shiporder> 

Wie Sie es enthält Aufträge sehen können, und es enthält wahrscheinlich mehr Aufträge innerhalb von Tags.

Das Schema sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="shiporder"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="orderperson" type="xs:string"/> 
     <xs:element name="shipto"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="name" type="xs:string"/> 
       <xs:element name="address" type="xs:string"/> 
       <xs:element name="city" type="xs:string"/> 
       <xs:element name="country" type="xs:string"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="item" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="title" type="xs:string"/> 
       <xs:element name="note" type="xs:string" minOccurs="0"/> 
       <xs:element name="quantity" type="xs:positiveInteger"/> 
       <xs:element name="price" type="xs:decimal"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute name="orderid" type="xs:string" use="required"/> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

Schließlich habe ich versucht, zu suchen, wie die Listview-Steuerelement füllen und zu verwalten, kann aber nichts genaues finden. Ich fand das zum Beispiel: Populate ListView from XML file Aber es scheint nicht in meinem Fall zu funktionieren, da es sich um Win Forms handelt. Ich habe viele verschiedene Ansätze ausprobiert, aber ich kann es nicht herausfinden.

Meine Default.aspx sieht wie folgt jetzt:

<%@ Page Title="Test" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> 

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> 

    <div class="jumbotron"> 
     <h2>Orders</h2> 
     <p>Showing orders from XML-file</p> 

     <asp:ListView ID="listViewOrders" DataSourceID="listViewOrders" runat="server"> 

     </asp:ListView> 
     <asp:Table ID="Table1" runat="server"></asp:Table> 

    </div> 

</asp:Content> 

Wie Sie sehen können, habe ich versucht, die Eigenschaft DataSourceID in der Listview-Steuerelement Einstellung wie auf Msdn (https://msdn.microsoft.com/en-us/library/bb398790.aspx#Code Beispiele) empfohlen, aber ich weiß nicht, Wie man es im C# -Code verwendet, wie die Code-Beispiele, die ich auf MSDN gefunden habe, beziehen sich auf die Verwendung von SQL-Datenbanken.

Sorry für lange Post und wenn etwas unklar ist oder sollte für mich offensichtlich sein, lass es mich wissen. Ich bin auf der Suche nach einer einfachen Lösung, da ich bei der Programmierung von Webanwendungen nicht sehr erfahren bin. Vielen Dank im Voraus!

Antwort

0

Konvertieren Sie Ihre XML in einen Datensatz, der die folgende Syntax verwendet.

DataSet testdataset = new DataSet(); 
testdataset.ReadXml("InputXmlAsString/FilePath/etc...."); 

weisen Sie dann diesen Datensatz/Datentabelle als Datenquelle Ihrer ListViewControl id "listViewOrders"

+0

Vielen Dank für Ihre Antwort Nikhil! Das ist interessant. Ich habe tatsächlich versucht, ein DataSet zu erstellen und ReadXml zu verwenden, aber dann schien es nicht so, als könnte ich meine XSD-Datei verwenden, um das DataSet zu validieren. Bitte lassen Sie mich wissen, ob es eine Möglichkeit gibt, den Inhalt auf eine ähnliche Weise zu validieren, wie ich es mit dem XDocument-Datentyp dargestellt habe. Ich habe wirklich versucht, nach Lösungen dafür zu suchen. –

+0

if (! Fehler) { "Set-Datensatz als Datenquelle von listviewcontrol" } sonst { erstellen Datensatz mit Fehlermeldung } –

+0

@ Nikkhil.Patel danke alot! Jetzt funktioniert es. Ich fand auch heraus, dass ich LayoutTemplate, ItemTemplate und EditTemplate erstellen musste, um alles zu tun, was ich brauchte. Obwohl ich nach einer vereinfachten Lösung fragte, die ich ohne Zweifel sehr gut erhalten habe, nehme ich an, dass dieser Weg nicht sehr effizient ist, da die Datei zweimal gelesen wird. Wenn die Datei sehr groß wäre, wäre es vielleicht eine schlechte Idee, die gesamte Datei einmal in den Speicher zu laden. –

Verwandte Themen