Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用行号C查找XML文件中的节点?_C#_Asp.net_Xml_Xpath - Fatal编程技术网

C# 如何使用行号C查找XML文件中的节点?

C# 如何使用行号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文件。当我在这个过程中使用它时,它会给我类似的错误

[2016-06-22 19:29:53 IST]错误:第15行第20列:元素电子的字符内容无效;必须等同于食品、商品或手机 /产品/产品[1]/项目类型

此XPath/products/product[1]不正确。这是他们系统的回报。 所以,我必须搜索它,并通过行编号替换为原始值

Order.xml


请让我知道如何使用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();