C# 如何从日志文件中获取Xml标记

C# 如何从日志文件中获取Xml标记,c#,xml,C#,Xml,我有一个日志文件示例,其中有一条错误消息和xml标记,例如 error message xmltag error message xml tag 问题是我只想获取xml标记,但得到的错误是“根级别的数据无效” c#代码为 XmlDocument xDoc=new XmlDocument(); xDoc.Load(“C:\\Users\\qadeer.hussain\\Desktop\\gw msg.log”); var nodes=xDoc.GetElementsByT

我有一个日志文件示例,其中有一条错误消息和xml标记,例如

   error message
   xmltag
   error message
   xml tag
问题是我只想获取xml标记,但得到的错误是“根级别的数据无效”

c#代码为


XmlDocument xDoc=new XmlDocument();
xDoc.Load(“C:\\Users\\qadeer.hussain\\Desktop\\gw msg.log”);
var nodes=xDoc.GetElementsByTagName(“消息”);
var resultNodes=新列表();
foreach(节点中的XmlNode节点)
{
if(node.Attributes!=null&&node.Attributes[“Receiver”]!=null&&node.Attributes[“Receiver”]。Value=“+921215648545”)
{
添加(节点);
}
}
xml文件是

      some value
      some value
      <Message type="email">
         <Details locale="en">
          <Part type="plain" id="email/plain/User.ResetPassword.email"/>
          </Details>
        <Subject>New Password</Subject>
        <Sender>BB.Ops@example.com</Sender>
               <Context>
       <Parameter name="pswr" value="00"/>

        <Receiver>a.k@example.com</Receiver>
一些值
一些价值
新密码
BB。Ops@example.com
A.k@example.com

一些值
一些价值
新密码
BB。Ops@example.com
A.k@example.com

您似乎试图将整个日志文件作为XML加载:

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("C:\\Users\\qadeer.hussain\\Desktop\\gw-msg.log");
这是行不通的,因为日志文件不是XML文件——它是一个恰好包含一些XML的文本文件


您需要解析日志文件并提取XML,以便使用
XmlDocument
加载它-解析文本文件的方法有很多,如果不了解您的问题域,我将不在这里详细介绍这些细节。

如前所述,该文件不是XML。您需要阅读每一行并确定它是xml的一部分还是消息的一部分。由于xml不在一行上,而且消息可以是任意长度的,这可能有点偶然

一种可能的解决方案(仅适用于您提供的示例)如下:

var filename = "...";
var xmlText = new StringBuilder();
bool isXml = false;
foreach (var line in System.IO.File.ReadLines(filename))
{
    if (line.Trim().StartsWith("<Message"))
        isXml = true;

    if (isXml)
    {
        xmlText.Append(line);
        if (line.Trim().EndsWith("</Message>"))
        {
            //var xdoc = XDocument.Parse(xmlText.ToString());
            var xdoc = new XmlDocument();
            xml.LoadXml(xmlText.ToString());

            //process xml here

            xmlText.Clear();
            isXml = false;
        }
    }
}
var filename=“…”;
var xmlText=新的StringBuilder();
bool-isXml=false;
foreach(System.IO.File.ReadLines(文件名)中的var行)
{

if(line.Trim().StartsWith("您应该向我们展示如何检索此xml代码以及如何使用它。我想,一条真实的日志消息也会有所帮助。我同意,向我们展示您正在解析的xml非常重要。您是否试图将整个日志文件解析为xml?这可能是原因,但如果看不到真实内容,则很难进行诊断解决您的问题。有些行由消息组成,有些是标记。您是在尝试将整个日志文件解析为XML吗?还是在读取XML文本然后尝试解析它?XmlDocument xDoc=new XmlDocument();xDoc.Load(“C:\\Users\\qadeer.hussain\\Desktop\\gw msg.log”);var nodes=xDoc.GetElementsByTagName(“消息”);var resultNodes=new List();foreach(节点中的XmlNode节点){if(node.Attributes!=null&&node.Attributes[“Receiver”]!=null&&node.Attributes[“Receiver”]。Value==“+921215648545”){resultNodes.Add(node);}谢谢你,但是你能建议我吗?我在互联网上搜索了很多如何将日志文件转换成xml文件,但我找不到,因为有很多不同的方法,我不知道你的日志文件的格式,所以这里的任何建议都只是猜测。我如何将这个xdoc写入另一个xml文件以便我可以从中轻松读取数据
XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("C:\\Users\\qadeer.hussain\\Desktop\\gw-msg.log");
var filename = "...";
var xmlText = new StringBuilder();
bool isXml = false;
foreach (var line in System.IO.File.ReadLines(filename))
{
    if (line.Trim().StartsWith("<Message"))
        isXml = true;

    if (isXml)
    {
        xmlText.Append(line);
        if (line.Trim().EndsWith("</Message>"))
        {
            //var xdoc = XDocument.Parse(xmlText.ToString());
            var xdoc = new XmlDocument();
            xml.LoadXml(xmlText.ToString());

            //process xml here

            xmlText.Clear();
            isXml = false;
        }
    }
}