繁体   English   中英

使用C#中某些值内的标签解析XML文件

[英]Parsing an XML file with tags inside some values in C#

首先,谢谢您的时间,我需要编写ac#代码以从REST Web服务获取XML响应,一些标记包含一个特殊字段,值中包含整个标记,这里是一个示例:

<Root date="22.22.2222" version="specific system versonning">
<record field1="value1"  field2="value1" specialfield="just_a_normal_value"/>
<record field1="value1"  field2"value2" specialfield=" <multiplesubfields subfield1= "subvalue1" subfield2="subvalue2"/> " field3="value3"/>
<record field1="value1"  field2"value2" specialfield=" <multiplesubfields subfield1= "subvalue1" subfield2="subvalue2" subfield3="subvalue3"/> " field3="value3"/>
<record field1="value1"  field2="value1" specialfield="just_a_normal_value"/>
</Root>

标签值内部的内部字段数不是固定的。 对于某些记录,特殊字段仅包含一个普通值,内部没有标签,在这种情况下,无需修改。

我想做的是检索那些子字段和值,并将它们添加到父标记中,因为它们在普通字段中,并从中删除字段特殊字段,结果应如下所示:

<Root date="22.22.2222" version="specific system versonning">
<record field1="value1"  field2="value1" specialfield="just_a_normal_value"/>
<record field1="value1"  field2"value2" subfield1= "subvalue1" subfield2="subvalue2" field3="value3"/>
<record field1="value1"  field2"value2" subfield1= "subvalue1" subfield2="subvalue2" subfield3="subvalue3" field3="value3"/>
<record field1="value1"  field2="value1" specialfield="just_a_normal_value"/>
</Root>

以下是获取XML文件的代码:

static void Main(string[] args)
    {
        string url = "www.blablabla.."

        HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
        req.Credentials = new NetworkCredential("USER", "PASSWORD");
        XmlDocument xmlDoc = new XmlDocument();

        using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
       {
        xmlDoc.Load(resp.GetResponseStream());
       }
    }

上面的代码正在工作,并且正在完美地提取文件,我用

 StringWriter sw = new StringWriter();
 XmlTextWriter tx = new XmlTextWriter(sw);
 xmlDoc.WriteTo(tx);
 System.Console.Writeline(sw.ToString());

但是我不知道如何以一种干净的方式进行其余工作。我在Stackoverflow和其他站点上阅读了许多其他类似的文章,但仍然无法入门。 我的意思是我自己有一些丑陋的弦乐对待想法,可能可行,但我什至不敢尝试。

谢谢大家阅读这篇文章。

        XDocument doc = XDocument.Parse(xml);

        var result = doc.Root.Descendants("record").Where(x => x.Attribute("specialfield") != null && x.Attribute("specialfield").Value.Contains("multiplesubfields"));

        foreach(var item in result)
        {
            item.Attribute("specialfield").Remove();
        }

您可以使用XDocument ,之后使用所有记录节点并搜索specifiedfield字段包含multiplesubfields字段字符串的属性。

LINQ to Xml是使用xml的便捷工具。

您可以将特殊的xml( <multiplesubfields> )解析为XElement并将解析后的元素的属性添加到父<record>

const string XMLSTART = " <multiplesubfields";
XDocument doc = XDocument.Load(yourResponseStream);

var specialsRecords =
    doc.Root
       .Descendants("record")
       .Where(rec => rec.Attribute("specialfield") != null)
       .Where(rec => rec.Attribute("specialfield").Value.StartsWith(XMLSTART));

foreach (var special in specialsRecords)
{
    var multiplesubfields = XElement.Parse(special.Attribute("specialfield").Value);
    foreach (var subField in multiplesubfields.Attributes())
    {
        special.Add(subField);
    }

    // Remove original attribute
    special.Attribute("specialfield").Remove();
}

Console.WriteLine(doc.ToString());

检查下面的网址,您可以获取样本xml研究它们并具有对象形式。 http://xmltocsharp.azurewebsites.net/

当我与Zenith Bank Nigeria Limite Soap API集成时,我也遇到了类似的问题。 他们的价值观并不一致,我不得不研究情况。 干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM