读取,修改和编写XML的最佳方法

won*_*nea 15 c# xml

我的计划是使用我的C#程序读取XML文档,搜索我想要更改的特定条目,然后写出修改后的文档.但是,我已经变得不稳定,因为很难区分元素,无论它们是使用XmlTextReader开始还是结束,我正在使用它来读取文件.我可以做一些建议让我走上正轨.

该文档是一个HTML文档,因此您可以想象,它非常复杂.

我想在HTML文档中搜索元素id,例如查找并更改src;

<img border="0" src="bigpicture.png" width="248" height="36" alt="" id="lookforthis" />
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 33

如果它实际上是有效的XML,并轻松放置于内存中,我会选择的LINQ to XML(XDocument,XElement每次等).它是迄今为止我用过的最好的XML API.它很容易形成查询,也很容易构建新元素.

其中,这是适当的,或内置轴方法(可以使用XPath Elements(),Descendants(),Attributes()等).如果您能告诉我们您遇到的具体问题,我很乐意帮助您了解如何在LINQ to XML中表达它们.

另一方面,如果这是不是有效XML的HTML ,那么您将会遇到更困难的时间 - 因为XML API通常希望使用有效的XML文档.您当然可以先使用HTMLTidy,但这可能会产生不良影响.

对于您的具体示例:

XDocument doc = XDocument.Load("file.xml");
foreach (var img in doc.Descendants("img"))
{
    // src will be null if the attribute is missing
    string src = (string) img.Attribute("src");
    img.SetAttributeValue("src", src + "with-changes");
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您正在处理的文件是否相对较小?如果是这样,您可以使用 XmlDocument 对象将它们加载到内存中,修改它,然后将更改写回。

XmlDocument doc = new XmlDocument();
doc.Load("path_to_input_file");
// Make changes to the document.
using(XmlTextWriter xtw = new XmlTextWriter("path_to_output_file", Encoding.UTF8)) {
  xtw.Formatting = Formatting.Indented; // optional, if you want it to look nice
  doc.WriteContentTo(xtw);
}
Run Code Online (Sandbox Code Playgroud)

根据输入 XML 的结构,这可以使您的解析代码更简单一些。