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

时间:2015-05-18 11:09:38

标签: 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.GetElementsByTagName("Message");
    var resultNodes = new List<XmlNode>();
    foreach(XmlNode node in nodes )
    {
        if (node.Attributes != null && node.Attributes["Receiver"] != null && node.Attributes["Receiver"].Value == "+921215648545")
        {
            resultNodes.Add(node);
        }
    }

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>

  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"/>
        </Context>
               <Receiver>a.k@example.com</Receiver>
      </Message>

2 个答案:

答案 0 :(得分:1)

如上所述,该文件不是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;
        }
    }
}

如果您可以更改日志文件的输出格式,我建议您更容易解析,例如在xml之前和之后添加一行只包含文本[XML]然后您可以查找那个令牌。

编辑:更新以使用XmLDocument而不是XDocument。

答案 1 :(得分:0)

您似乎正在尝试将整个日志文件加载为XML:

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("C:\\Users\\qadeer.hussain\\Desktop\\gw-msg.log");

这不起作用,因为日志文件不是XML文件 - 它是一个恰好包含一些XML的文本文件。

您需要解析日志文件并提取XML以便使用XmlDocument加载它 - 有很多方法可以解析文本文件,而不了解您的问题域我不会进入这些细节在这里。