C# 如何使用行号C查找XML文件中的节点?
我有以下XML文件。当我在这个过程中使用它时,它会给我类似的错误 [2016-06-22 19:29:53 IST]错误:第15行第20列:元素电子的字符内容无效;必须等同于食品、商品或手机 /产品/产品[1]/项目类型 此XPath/products/product[1]不正确。这是他们系统的回报。 所以,我必须搜索它,并通过行编号替换为原始值 Order.xmlC# 如何使用行号C查找XML文件中的节点?,c#,asp.net,xml,xpath,C#,Asp.net,Xml,Xpath,我有以下XML文件。当我在这个过程中使用它时,它会给我类似的错误 [2016-06-22 19:29:53 IST]错误:第15行第20列:元素电子的字符内容无效;必须等同于食品、商品或手机 /产品/产品[1]/项目类型 此XPath/products/product[1]不正确。这是他们系统的回报。 所以,我必须搜索它,并通过行编号替换为原始值 Order.xml 请让我知道如何使用XML文档中的第15行进行搜索这对您有用吗 string[] lines = File.ReadAllLines
请让我知道如何使用XML文档中的第15行进行搜索这对您有用吗
string[] lines = File.ReadAllLines(@"C:\order.xml", Encoding.UTF8);
var line15 = lines[14];
您可以使用上述代码删除节点…使用适当的Xpath,您可以删除所有不等于食品、商品或手机的商品类型。处理xml时,不应依赖行/列编号。Xml不太关心空白,格式化只是为了方便可读性;虽然你的例子中正确地报道了这一点,但我不相信将来会一直如此。有趣的是,xpath也是不正确的,但我们暂时不要讨论这个问题 你需要重新控制这个问题。。。您应该创建自己的验证读取器,并在解析xml时捕获验证错误。如何做到这一点将取决于您使用的框架。XmlValidatingReader或具有适当XmlReaderSettings的XmlReader。 您可以设置一个回调/eventhandler,在读取xml文件时捕获错误,这样您就可以确定自己的位置正确,并且手头有处理错误所需的所有信息。使用XmlReader还允许您继续处理整个文件,而不仅仅是在出现第一个错误时停止 代码对于SO来说太大了,我们需要您提供更多的信息,但谷歌搜索会找到很多示例,包括来自microsoft的示例: 构造一个新的XmlReaderSettings实例 将XML架构添加到XmlReaderSettings实例的Schemas属性 将架构指定为ValidationType 指定ValidationFlags和ValidationEventHandler以处理验证期间遇到的架构验证错误和警告 将XmlReaderSettings对象与XML文档一起传递给XmlReader类的Create方法,创建一个验证XmlReader的模式 调用Read从头到尾遍历xml 试试这个
var xml = XDocument.Load(@"C:\order.xml", LoadOptions.SetLineInfo);
var lineNumbers = xml.Descendants()
.Where(x => !x.Descendants().Any() && //exact node contains the value
x.Value.Contains("foods"))
.Cast<IXmlLineInfo>()
.Select(x => x.LineNumber);
int getLineNumber = lineNumbers.First();
根据标记,我认为他需要Xpath或LinqXML方法。这个答案很狡猾…@Null-Head:谢谢你的回答!通过您的解决方案,我只能读取这些行,但是如果我想从当前XML文件中删除整个节点,那么我必须在代码中使用一些XML操作。这将是如何实现的?过程是什么?为什么会抛出此错误?是XSD验证失败了吗?
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\order.xml");
XmlElement el =(XmlElement)doc.SelectSingleNode("/products/product[1]/item_type");
if(el != null) { el.ParentNode.RemoveChild(el); }
var xml = XDocument.Load(@"C:\order.xml", LoadOptions.SetLineInfo);
var lineNumbers = xml.Descendants()
.Where(x => !x.Descendants().Any() && //exact node contains the value
x.Value.Contains("foods"))
.Cast<IXmlLineInfo>()
.Select(x => x.LineNumber);
int getLineNumber = lineNumbers.First();