前三行和后四行修剪的C#编程
下面是我的XML文件。我想使用C从XML中获取节点“name”#前三行和后四行修剪的C#编程,c#,xml,C#,Xml,下面是我的XML文件。我想使用C从XML中获取节点“name”# “EventObjectsRead”(“73”) 消息属性: SATRCFG_对象[xml]= IATRCFG_总计数[int]=1 IATRCFG_对象计数[int]=1 IATRCFG_对象类型[int]=5 IATRCFG_请求ID[int]=3 是否有一种直接从上面的XML获取节点“名称”的方法,或者是否需要修剪前三行和后四行。我该怎么做。根据您提供给我们的字符串和您想做的事情的描述,我假设您想从文件中提取XMl。我会用
“EventObjectsRead”(“73”)
消息属性:
SATRCFG_对象[xml]=
IATRCFG_总计数[int]=1
IATRCFG_对象计数[int]=1
IATRCFG_对象类型[int]=5
IATRCFG_请求ID[int]=3
是否有一种直接从上面的XML获取节点“名称”的方法,或者是否需要修剪前三行和后四行。我该怎么做。根据您提供给我们的字符串和您想做的事情的描述,我假设您想从文件中提取XMl。我会用以下方法:
string text = System.IO.File.ReadAllText(@"C:\docs\myfile.txt");
Regex r = new Regex("<ConfData>(.|\r\n)*?</ConfData>");
var v = r.Match(text);
string myResult = "<ConfData>" + v.Groups[0].ToString() + "</ConfData>";
string text=System.IO.File.ReadAllText(@“C:\docs\myfile.txt”);
正则表达式r=新正则表达式((.|\r\n)*?);
var v=r.Match(文本);
字符串myResult=”“+v.Groups[0]。ToString()+“”;
这里有两种方法可以实现这一点。使用字符串操作或正则表达式:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Name: {0}", GetNameFromFileString(File.ReadAllText("file.txt")));
Console.WriteLine("Name: {0}", GetNameFromFile("file.txt"));
}
private static string GetNameFromFileString(string filecontent)
{
Regex r = new Regex("(?<Xml><ConfData>.*</ConfData>)", RegexOptions.Singleline);
var match = r.Match(filecontent);
var xmlString = match.Groups["Xml"].ToString();
return GetNameFromXmlString(xmlString);
}
private static string GetNameFromFile(string filename)
{
var lines = File.ReadAllLines(filename);
var xml = new StringBuilder();
var isXml = false;
foreach (var line in lines)
{
if (line.Contains("<ConfData>"))
isXml = true;
if (isXml)
xml.Append(line.Trim());
if (line.Contains("</ConfData>"))
isXml = false;
}
var text = xml.ToString();
return GetNameFromXmlString(text);
}
private static string GetNameFromXmlString(string text)
{
var xDocument = XDocument.Parse(text);
var cfgAgentGroupt = xDocument.Root.Element("CfgAgentGroup");
var cfgGroup = cfgAgentGroupt.Element("CfgGroup");
var name = cfgGroup.Element("name");
var nameValue = name.Attribute("value");
var value = nameValue.Value;
return value;
}
}
类程序
{
静态void Main(字符串[]参数)
{
WriteLine(“Name:{0}”,GetNameFromFileString(File.ReadAllText(“File.txt”));
WriteLine(“名称:{0}”,GetNameFromFile(“file.txt”);
}
私有静态字符串GetNameFromFileString(字符串文件内容)
{
Regex r=newregex((?*),RegexOptions.Singleline);
var match=r.match(filecontent);
var xmlString=match.Groups[“Xml”].ToString();
返回GetNameFromXmlString(xmlString);
}
私有静态字符串GetNameFromFile(字符串文件名)
{
var lines=File.ReadAllLines(文件名);
var xml=新的StringBuilder();
var isXml=false;
foreach(行中的var行)
{
如果(第行包含(“”))
isXml=true;
if(isXml)
Append(line.Trim());
如果(第行包含(“”))
isXml=false;
}
var text=xml.ToString();
返回GetNameFromXmlString(文本);
}
私有静态字符串GetNameFromXmlString(字符串文本)
{
var xDocument=xDocument.Parse(文本);
var cfgAgentGroupt=xDocument.Root.Element(“CfgAgentGroup”);
var cfgGroup=cfgAgentGroupt.Element(“cfgGroup”);
var name=cfgGroup.Element(“名称”);
var nameValue=name.Attribute(“值”);
var value=nameValue.value;
返回值;
}
}
您可以使用原始字符串上的正则表达式提取要查找的节点(其中str是字符串数据):
您的问题出在哪里?看起来您的xml嵌入了另一种文件格式。我假设您首先要解析它,然后是xml。您的根元素总是
ConfData
?@Serv:为什么不?删除前两行和后四行时,您将从文件中提取XML。然后将其合并到您的答案中,好吗?@Serv您能解释一下吗?OP想要XML,显然他们的问题表述错误,应该是“如何让XML摆脱这种混乱”@Stenportov好吧,你是什么意思。与问题的复杂性相比,代码太大了。@Stenportov这只是另一种再次说明问题的方式。当然可以短于11行,但关于他的代表,我的回答比必要的要长一点。但是我当然期待您的回答。当在xml中添加新行时,这段代码会引发一个异常。(). 上面的代码抛出错误un-handled exception(DevLab_DLG_CM”)。当我试图从每个节点CfgGroup获取名称详细信息时。下面是导致异常的XML:-如果要使用正则表达式,您最好在整个输入上使用它str
在这两个示例中都是整个输入。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Name: {0}", GetNameFromFileString(File.ReadAllText("file.txt")));
Console.WriteLine("Name: {0}", GetNameFromFile("file.txt"));
}
private static string GetNameFromFileString(string filecontent)
{
Regex r = new Regex("(?<Xml><ConfData>.*</ConfData>)", RegexOptions.Singleline);
var match = r.Match(filecontent);
var xmlString = match.Groups["Xml"].ToString();
return GetNameFromXmlString(xmlString);
}
private static string GetNameFromFile(string filename)
{
var lines = File.ReadAllLines(filename);
var xml = new StringBuilder();
var isXml = false;
foreach (var line in lines)
{
if (line.Contains("<ConfData>"))
isXml = true;
if (isXml)
xml.Append(line.Trim());
if (line.Contains("</ConfData>"))
isXml = false;
}
var text = xml.ToString();
return GetNameFromXmlString(text);
}
private static string GetNameFromXmlString(string text)
{
var xDocument = XDocument.Parse(text);
var cfgAgentGroupt = xDocument.Root.Element("CfgAgentGroup");
var cfgGroup = cfgAgentGroupt.Element("CfgGroup");
var name = cfgGroup.Element("name");
var nameValue = name.Attribute("value");
var value = nameValue.Value;
return value;
}
}
// Use Regex to match the exact string and parse that to XElement.
string nameXML = Regex.Match(str, @"<name +value="".*"" */>").Groups[0].Value;
XElement name = XElement.Parse(nameXML);
// Split the string into groups using newline as a delimiter.
string[] groups = str.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
// Use skip and take to trim the first 3 and last 4 elements.
// Rejoin the remainder back together with empty strings and parse the XElement.
string xmlString = string.Join(string.Empty, groups.Take(groups.Length - 4).Skip(3));
XElement xml = XElement.Parse(xmlString);
// Use Descendants and First to get the first node called 'name' in the XML.
XElement name = xml.Descendants("name").First();