前三行和后四行修剪的C#编程

前三行和后四行修剪的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。我会用

下面是我的XML文件。我想使用C从XML中获取节点“name”#

“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();