我有一个日志文件示例,其中我有一个错误消息加上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>
答案 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
加载它 - 有很多方法可以解析文本文件,而不了解您的问题域我不会进入这些细节在这里。