我正在研究MVC Web API,我需要将一个函数转换为XML文件。
private string DbToXml(int fileID)
{
DataSet ds = new DataSet("Requirements");
string connetionString = ConfigurationManager.ConnectionStrings["DemoConnectionString"].ConnectionString;
string XML;
using (SqlConnection connection = new SqlConnection(connetionString))
{
string sql = "SELECT RequirementLabel as ID, VagueWord, Suggestion, Explanation, VaguePhrase, ContentText, VagueTypeText FROM [Test].[dbo].[Vague_Terms_View] where FileID=" + fileID;
string XML_Output_Path = System.Configuration.ConfigurationManager.AppSettings.Get("XML_Output_Path");
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
adapter.Fill(ds, "Requirement");
var sb = new StringBuilder();
XmlWriter xmlWrite = XmlWriter.Create(sb);
ds.WriteXml(xmlWrite);
XML = ds.GetXml();
}
我从下面的代码中获取XML,这是正确的。
<?xml version="1.0" encoding="utf-8"?>
<Requirements>
<Requirement>
<ID>Req97</ID>
<VagueWord>or</VagueWord>
<Suggestion>Keep each requirement in a single sentence.</Suggestion>
<Explanation>Suggests that you are combining requirements. Requirements that contain conjunctions/disjunctions (AND/OR) are dangerous and can lead to downstream problems in defining scope of the requirement.</Explanation>
<VaguePhrase>Marketing or Servicing</VaguePhrase>
<ContentText>If a user is identified as Marketing or Servicing, then the Campaign Management (CM) hyperlink should be displayed.</ContentText>
<VagueTypeText>Not Standard</VagueTypeText>
</Requirement>
<Requirement>
<ID>Req97</ID>
<VagueWord>should</VagueWord>
<Suggestion>Use 'shall/must/will' for requirements,</Suggestion>
<Explanation>Is often ambiguous, or inappropriate. Some readers will interpret these as optional or advisory, others as required.</Explanation>
<ContentText>If a user is identified as Marketing or Servicing, then the Campaign Management (CM) hyperlink should be displayed.</ContentText>
<VagueTypeText>Not Standard</VagueTypeText>
</Requirement>
<Requirement>
<ID>Req98</ID>
<VagueWord>Unless</VagueWord>
<Suggestion>Specify each conditions explicitly. One condition per requirement.</Suggestion>
<Explanation>Is an escape clause. Requirements with escape clauses are not testable. The word implies additional condition to the requirement.</Explanation>
<ContentText>Unless Sleep, Latency, Noise, or apply conditions are present, the data transmissions will contain the code for Normal Operation.</ContentText>
<VagueTypeText>Not Standard</VagueTypeText>
</Requirement>
</Requirements>
但现在我需要转换XML,检查Requirement节点中的ID元素。如果它在Requirement节点下面重复,则将其重命名为Requirement节点内的所有其他元素以追加id = 1,并且数字依此类推。 上述XML的预期输出如下所示。
<?xml version="1.0" encoding="utf-8"?>
<Requirements>
<Requirement>
<ID "id=1">Req97</ID>
<VagueWord "id=1">or</VagueWord>
<Suggestion "id=1">Keep each requirement in a single sentence.</Suggestion>
<Explanation "id=1">Suggests that you are combining requirements. Requirements that contain conjunctions/disjunctions (AND/OR) are dangerous and can lead to downstream problems in defining scope of the requirement.</Explanation>
<VaguePhrase "id=1">Marketing or Servicing</VaguePhrase>
<ContentText "id=1">If a user is identified as Marketing or Servicing, then the Campaign Management (CM) hyperlink should be displayed.</ContentText>
<VagueTypeText "id=1">Not Standard</VagueTypeText>
</Requirement>
<Requirement>
<ID "id=2">Req97</ID>
<VagueWord "id=2">should</VagueWord>
<Suggestion "id=2">Use 'shall/must/will' for requirements,</Suggestion>
<Explanation "id=2">Is often ambiguous, or inappropriate. Some readers will interpret these as optional or advisory, others as required.</Explanation>
<ContentText "id=2">If a user is identified as Marketing or Servicing, then the Campaign Management (CM) hyperlink should be displayed.</ContentText>
<VagueTypeText "id=2">Not Standard</VagueTypeText>
</Requirement>
<Requirement>
<ID>Req98</ID>
<VagueWord>Unless</VagueWord>
<Suggestion>Specify each conditions explicitly. One condition per requirement.</Suggestion>
<Explanation>Is an escape clause. Requirements with escape clauses are not testable. The word implies additional condition to the requirement.</Explanation>
<ContentText>Unless Sleep, Latency, Noise, or apply conditions are present, the data transmissions will contain the code for Normal Operation.</ContentText>
<VagueTypeText>Not Standard</VagueTypeText>
</Requirement>
</Requirements>
答案 0 :(得分:2)
var doc = XElement.Load("test.xml");
var dict = doc.Elements("Requirement")
.Elements("ID")
.GroupBy(id => id.Value)
.ToDictionary(id => id.Key, id => id.Count() > 1 ? 1 : 0);
foreach (var req in doc.Elements("Requirement"))
{
var id = req.Element("ID").Value;
if (dict[id] > 0)
{
foreach (var elem in req.Elements())
{
elem.Add(new XAttribute("id", dict[id]));
}
dict[id]++;
}
}
现在doc
包含xml,并在需要时添加了id
属性。
答案 1 :(得分:0)
您可以对其进行反序列化(从XML创建对象),将ID修改为对象,然后将对象序列化为XML,或者直接编辑XML。
这是如何直接编辑XML的一个很好的例子:How to modify existing XML file with XmlDocument and XmlNode in C#。
答案 2 :(得分:0)
我使用了以下解决方案,不确定是否已优化
XmlElement root = returnXmlFile.DocumentElement;
XmlNodeList nodes = root.ChildNodes;
for (int i = 0; i < nodes.Count; i++)
{
string OuterIDvalue = nodes[i].ChildNodes[0].InnerText.ToString();
const int idVal = 1;
int counter = 1;
if (nodes[i].FirstChild.Attributes.Count == 0)
{
for (int ctrInner = 0; ctrInner < nodes[i].ChildNodes.Count; ctrInner++)
{
XmlAttribute xKey = returnXmlFile.CreateAttribute("id");
xKey.Value = idVal.ToString();
nodes[i].ChildNodes[ctrInner].Attributes.Append(xKey);
}
}
for (int j = i + 1; j < nodes.Count; j++)
{
string innerIDvalue = nodes[j].ChildNodes[0].InnerText.ToString();
if (OuterIDvalue == innerIDvalue && nodes[j].FirstChild.Attributes.Count == 0)
{
counter++;
for (int ctr = 0; ctr < nodes[j].ChildNodes.Count; ctr++)
{
XmlAttribute xKey = returnXmlFile.CreateAttribute("id");
xKey.Value = counter.ToString();
nodes[j].ChildNodes[ctr].Attributes.Append(xKey);
}
}
}
}
string xmlnew = returnXmlFile.InnerXml;
returnXmlFile.Save(FileName);
return xmlnew;
}