使用xpath web api c#从xml获取数据



我开始说我正在使用c#和。net core 5开发一个异步web api应用程序。

这个应用程序需要读取一个XML文件,给出"ok";响应(异步模式),并返回值,以便将它们插入到数据库中。

我写了一个这样的算法来读取节点列表,但我不知道为什么它不能通过nodeList正确迭代…

public class LetturaXml
{
public List<InsertClassDTO> xmlToList(InputDTO input)
{
List<InsertClassDTO> list = new List<AnnuncioAutoDTO>();
XmlDocument doc = new XmlDocument();
doc.Load(input.filePath);
XmlNodeList nodeList = doc.SelectNodes("//ITEM[@CATEGORYID=10]");
foreach (XmlNode item in nodeList)
{
//.... tranfert into DTO, then into list, and finally insert into DB for every iteration
}
}
}

谢谢大家的帮助!

公立小学xml的例子:

<ITEM ID="5331" CITYID="7" CATEGORYID="10" LASTUPDATE="2021-05-14" EXPIRED="0">
<ISTAT>000</ISTAT>
<TITLE><![CDATA[title]]></TITLE>
<TEXT>
<![CDATA[text]]>
</TEXT>
<EMAIL>@hotmail.it</EMAIL>
<ATTRIBUTELIST>
<ATTRIBUTE>
<ATTRID>prezzo</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[3400]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>telagenzia</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[33333333333]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>contattotelefonico</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[33333333333]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>2</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL><![CDATA[example]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>4</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL><![CDATA[example]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>indirizzoagenzia</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[example]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>comuneagenzia</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[example]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>capagenzia</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[example]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>inserzionistaauto</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>tipocomprovendo</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>inserzionistaauto</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>marca</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>modello</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>condizioneveicolo</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>km</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[example]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>immatricolazione</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[example]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>alimentazione</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL></ATTRVAL>
</ATTRIBUTE>
</ATTRIBUTELIST>
<IMAGELIST>
<IMGFILE><![CDATA[exampleLink.jpg]]></IMGFILE>
</IMAGELIST>
</ITEM>

希望这是一个足够让你完成的起点:

var xml = @"
<ITEM ID=""5331"" CITYID=""7"" CATEGORYID=""10"" LASTUPDATE=""2021-05-14"" EXPIRED=""0"">
<ISTAT>000</ISTAT>
<TITLE><![CDATA[title]]></TITLE>
<TEXT>
<![CDATA[text]]>
</TEXT>
<EMAIL>@hotmail.it</EMAIL>
<ATTRIBUTELIST>
<ATTRIBUTE>
<ATTRID>prezzo</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[3400]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>telagenzia</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[33333333333]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>contattotelefonico</ATTRID>
<ATTRNAME></ATTRNAME>
<ATTRVAL><![CDATA[33333333333]]></ATTRVAL>
</ATTRIBUTE>
<ATTRIBUTE>
<ATTRID>2</ATTRID>
<ATTRNAME><![CDATA[example]]></ATTRNAME>
<ATTRVAL><![CDATA[example]]></ATTRVAL>
</ATTRIBUTE>
</ATTRIBUTELIST>
<IMAGELIST>
<IMGFILE><![CDATA[exampleLink.jpg]]></IMGFILE>
</IMAGELIST>
</ITEM>";
var list = new List<InsertClassDTO>();
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml); // LoadXml() is used to load XML from a string. Use Load() to load XML from a file path)
XmlNodeList nodeList = doc.SelectNodes("//ITEM[@CATEGORYID=10]");
foreach (XmlNode item in nodeList)
{
//.... tranfert into DTO, then into list, and finally insert into DB for every iteration
var attirbutes = new List<Attirbute>();
foreach (XmlNode x in item["ATTRIBUTELIST"].SelectNodes("ATTRIBUTE/ATTRID[text() = 'prezzo'] | ATTRIBUTE/ATTRID[text() = 'telagenzia']"))
{
attirbutes.Add(new Attirbute()
{
Id = x.ParentNode["ATTRID"].InnerText,
Value = x.ParentNode["ATTRVAL"].InnerText,
});
}
list.Add(new InsertClassDTO()
{
Email = item["EMAIL"].InnerText,
Attributes = attirbutes
});
}

你还需要一些模型:

public class InsertClassDTO
{
public string Email { get; set; }
public List<Attirbute> Attributes { get; set; }

}
public class Attirbute
{
public string Id { get; set; }
public string Value { get; set; }
}

最新更新