2013-04-16 34 views
13

Tôi đang đọc tệp XML trong C# bằng cách sử dụng XMLDocument. Mã của tôi đi như thế này:Làm thế nào để xóa dòng đầu tiên của tệp XML bằng cách sử dụng XMLDocument trong C#?

XmlDocument doc = new XmlDocument(); 
doc.Load(xmlSourceFile); 

Dòng đầu tiên của tài liệu XML của tôi là

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

tôi phải xóa dòng này. Tôi nên thế nào?

+0

Tôi đoán rằng dòng đầu tiên là cần thiết để 'XmlDocument' đọc đúng tệp, như biết mã hóa nào sẽ sử dụng. Bất kỳ lý do nào khiến bạn không thể xóa dòng đó như thể nó là một tệp văn bản chuẩn? – LightStriker

+3

Tại sao bạn muốn xóa * hướng dẫn xử lý * này? –

+1

Nó không phải là một dòng, nó là một yếu tố. Và nó làm hại không ai, vậy tại sao lại bận tâm? Vấn đề của bạn là yêu cầu của bạn. –

Trả lời

18

Tôi không thấy lý do bạn muốn xóa điều đó. Nhưng nếu nó là cần thiết, bạn có thể thử này:

XmlDocument doc = new XmlDocument(); 
doc.Load("something"); 

foreach (XmlNode node in doc) 
{ 
    if (node.NodeType == XmlNodeType.XmlDeclaration) 
    { 
     doc.RemoveChild(node); 
    } 
} 

hoặc với LINQ:

var declarations = doc.ChildNodes.OfType<XmlNode>() 
    .Where(x => x.NodeType == XmlNodeType.XmlDeclaration) 
    .ToList(); 

declarations.ForEach(x => doc.RemoveChild(x)); 
+1

Tôi cần làm điều này vì tôi cần phải so sánh hai chuỗi XML, một trong số đó có tiêu đề XML trong khi cái kia không (phần thứ hai không phải vì nó được trích xuất từ ​​một tài liệu XML lớn hơn). – Drew

+0

Điều này hoạt động tuyệt vời, nhân tiện. Cảm ơn bạn – Drew

+0

Đôi khi chúng ta cần hack. Tôi cũng cần phải loại bỏ khai báo xml cho một yêu cầu saml. Cảm ơn bạn – Paulj

1

tôi hiểu sự cần thiết để loại bỏ Tuyên bố XML; Tôi đang làm việc trên một kịch bản thay đổi nội dung của ứng dụng preferences.xml và ứng dụng không đọc tệp đúng cách nếu khai báo có (không chắc chắn lý do các nhà phát triển quyết định bỏ qua khai báo XML).

Thay vì rối tung xung quanh với XML nữa, tôi chỉ cần tạo phương thức removeXMLdeclaration() đọc tệp XML và xóa dòng đầu tiên, sau đó viết lại nó đơn giản bằng cách sử dụng trình soạn thảo/người viết. Nó rất nhanh và hoạt động rất tốt! Tôi chỉ cần gọi phương thức sau khi tôi đã thực hiện tất cả thay đổi XML của mình để làm sạch tệp một lần và cho tất cả.

Đây là mã:

public void removeXMLdeclaration() 
    { 
     try 
     { 
      //Grab file 
      StreamReader sr = new StreamReader(xmlPath); 

      //Read first line and do nothing (i.e. eliminate XML declaration) 
      sr.ReadLine(); 
      string body = null; 
      string line = sr.ReadLine(); 
      while(line != null) // read file into body string 
      { 
       body += line + "\n"; 
       line = sr.ReadLine(); 
      } 
      sr.Close(); //close file 

      //Write all of the "body" to the same text file 
      System.IO.File.WriteAllText(xmlPath, body); 
     } 
     catch (Exception e3) 
     { 
      MessageBox.Show(e3.Message); 
     } 

    } 
-1

Có một cách khác để đóng dòng tập tin tập tin sử dụng này.

public void xyz() 
{ 
     FileStream file = new FileStream(xmlfilepath, FileMode.Open, FileAccess.Read); 
     XmlDocument doc = new XmlDocument(); 
     doc.load(xmlfilepath); 

     // do whatever you want to do with xml file 

     //then close it by 
     file.close(); 
     File.Delete(xmlfilepath); 
} 
5

Hoặc bạn có thể sử dụng điều này;

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 
if (xmlDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration) 
    xmlDoc.RemoveChild(xmlDoc.FirstChild); 
4

Tôi cần có chuỗi xê-ri XML không có tiêu đề khai báo để mã sau hoạt động cho tôi.

StringBuilder sb = new StringBuilder(); 
XmlWriterSettings settings = new XmlWriterSettings { 
    Indent = true, 
    OmitXmlDeclaration = true, // this makes the trick :) 
    IndentChars = " ", 
    NewLineChars = "\n", 
    NewLineHandling = NewLineHandling.Replace 
}; 
using (XmlWriter writer = XmlWriter.Create(sb, settings)) { 
    doc.Save(writer); 
} 
return sb.ToString(); 
Các vấn đề liên quan