2012-03-27 1 views
2

Wie kann ich der eckigen Klammern am Ende des folgenden XML DoctypeWie loswerden eckigen Klammern [] nach dem Bearbeiten und Speichern einer XML-Datei

<!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd"[]> 

Ich habe Code loszuwerden, die eine XML lädt Datei, nehmen Sie einige Änderungen vor und speichern Sie die Datei.

ist hier die Überschrift der Originaldatei (keine eckigen Klammern):

<!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd"> 

Wie Sie es nicht sehen kann, ist [] am Ende der "SMIL20.dtd">"

, wenn ich das Dokument konvertieren es schafft ein Paar eckige Klammern wie folgt "SMIL20.dtd" []>. Hier

ist ein Beispiel:

class FileWorker 
{ 
    public static void UpdateFile(string myfile) 
    { 
      var doc = XDocument.Load(myfile);   
      try 
      { 
       foreach (var elem in doc.Elements()) 
       { 

        if (elem.Name.LocalName == "type") 
        { 
         foreach (var child in elem.Elements()) 
         { 
          if (child.Name.LocalName == "head") 
          { 
           foreach (var gc in child.Elements()) 
           { 
            if (Configuration.Cdntosync == 0) 
            { 
             if (gc.Attributes().Any(att => att.Name.LocalName == "name" && att.Value == "httpBase")) 
             { 
              gc.RemoveAttributes(); 
              gc.Add(new XAttribute("base", "rtmp://mybase")); 
             } 
            } 
            else if (Configuration.Cdntosync == 1) 
            { 
             if(gc.Attributes().Any(att => att.Name.LocalName == "name" && att.Value == "vod")) 
             { 
              gc.Remove(); 
             } 
             gc.RemoveAttributes(); 
             if (basecheck == false) 
             { 
              gc.Add(new XAttribute("base", "rtmp://mybase2")); 
              basecheck = true; 
             } 
            } 
           } 

           basecheck = false; 
          } 
          else if (child.Name.LocalName == "body") 
          { 
           foreach (var gc in child.Elements()) 
           { 
            if (gc.Name.LocalName == "switch") 
            { 
             foreach (var video in gc.Elements()) 
             { 
              foreach (var att in video.Attributes()) 
              { 
               if (att.Name.LocalName == "src") 
               { 

                att.Value = att.Value.Replace("v1/test/", "mp4:Flvstream/"); 

               } 
              } 
             } 
            } 
           } 
          } 
         } 
        } 


        doc.Save(myfile); 

       } 

      } 
     catch(Exception ex) 
      { 
       logger.Log(ExceptionLogger.LogLevel.ERROR, ex); 

      } 

     //} 

    } 
+0

Vielleicht ist der Compiler müde von der hohen Verschachtelungsebene und warf einige Klammern aus der Verwirrung :-) ich einige XPath-Ausdrücke verwenden würde, statt foreaching das DOM ... – seldary

Antwort

5

Nur über das gleiche Problem selbst kommen. Ich möchte meine Lösung für diejenigen teilen, die nach dem gleichen Problem suchen. Hier ist sie:

doc.DocumentType.InternalSubset = null; 
+0

Sie kann nicht gesetzt InternalSubset auf Null in 4.0, es ist eine Eigenschaft readonly – Les

+0

Es ist nicht readonly in 4.0 ([link] (http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocumenttype.internalsubset%28v= vs.110% 29.aspx)). Ich habe den obigen Vorschlag ausprobiert, aber der InternalSubset war sowieso null. Vielleicht etwas damit zu tun, dass der XmlWriter null nicht berücksichtigt? –

+0

_ "Sie können InternalSubset in 4.0 nicht auf Null setzen, es ist eine schreibgeschützte Eigenschaft" _. InternalSubset ist schreibgeschützt für XmlDocument. InternalSubset ist schreibbar für XDocument. – wisbucky

Verwandte Themen