[英]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.