【发布时间】:2017-10-30 14:34:06
【问题描述】:
我有一个 xml
<PolicyHdr>
<PolicyHdrData>
<ID>123</ID>
</PolicyHdrData>
</PolicyHdr>
<Role>
<RoleData>
<DisplayFieldName>Payor</DisplayFieldName>
</RoleData>
</Role>
<PolicyCovHdr>
<PolicyCovHdrData>
<ID>000</ID>
<PolicyHdrID>123</PolicyHdrID>
</PolicyCovHdrData>
</PolicyCovHdr>
<Role>
<RoleData>
<DisplayFieldName>Insured</DisplayFieldName>
</RoleData>
</Role>
我需要修改此 xml,使 PolicyCovHdr 作为 PolicyHDr 的子节点出现,其中 PolicyHdr 下的 ID 节点等于 POlicyCovHDr 下的 PolicyHdrID。 同样角色节点,只要 DisplayFieldName 是 Payor,它就应该是 PolicyHdr 的子节点,而 DisplayFieldName 的 Insure 它应该是 PolicyCovHdr 的子节点
所以最终的 xml 应该是这样的:-
<PolicyHdr>
<PolicyHdrData>
<ID>123</ID>
<Role>
<RoleData>
<DisplayFieldName>Payor</DisplayFieldName>
</RoleData>
</Role>
</PolicyHdrData>
<PolicyCovHdr>
<PolicyCovHdrData>
<ID>000</ID>
<PolicyHdrID>123</PolicyHdrID>
<Role>
<RoleData>
<DisplayFieldName>Insured</DisplayFieldName>
</RoleData>
</Role>
</PolicyCovHdrData>
</PolicyCovHdr>
</PolicyHdr>
有人可以帮我解决一些我可以用来实现这个xml的逻辑
您好,抱歉,我忘记在此处添加我的代码更改
string xml1 = "<xml><PolicyHdr><PolicyHdrData><ID>123</ID></PolicyHdrData></PolicyHdr><Role><RoleData><DisplayFieldName>Payor</DisplayFieldName></RoleData></Role><PolicyCovHdr><PolicyCovHdrData><ID>000</ID><PolicyHdrID>123</PolicyHdrID></PolicyCovHdrData></PolicyCovHdr><Role><RoleData><DisplayFieldName>Insured</DisplayFieldName></RoleData></Role></xml>";
XmlDocument test = new XmlDocument();
test.LoadXml(xml1);
XmlNodeList polList = test.SelectNodes("//PolicyHdr/PolicyHdrData");
foreach (XmlNode xn in polList)
{
XmlNode polNode = xn.SelectSingleNode("//PolicyHdr/PolicyHdrData/ID");
XmlNodeList polCovNodeList = test.SelectNodes("//PolicyCovHdr/PolicyCovHdrData");
foreach (XmlNode yn in polCovNodeList)
{
XmlNode polCovPolNode = yn.SelectSingleNode("//PolicyCovHdr/PolicyCovHdrData/PolicyHdrID");
if(polNode.InnerText.ToString().Equals(polCovPolNode.InnerText.ToString()))
{
xn.AppendChild(yn);
}
}
XmlNodeList polRoleList = test.SelectNodes("//Role/RoleData");
foreach (XmlNode zn in polRoleList )
{
XmlNode RoleNode = zn.SelectSingleNode("//Role/RoleData/DisplayFieldName");
if(RoleNode.InnerText.ToString().Equals("Payor"))
{
xn.AppendChild(zn);
}
//Console.WriteLine(RoleNode.InnerText.ToString());
}
Console.WriteLine(xn.OuterXml.ToString());
}
我现在面临的问题是复杂性是 (n^2) 并且当 DisplayFieldName = Insured 时将 Role 节点作为子节点添加到 PolicyCovHdr。
现在的输出是这样的
<PolicyHdrData><ID>123</ID><PolicyCovHdrData><ID>000</ID><PolicyHdrID>123</PolicyHdrID></PolicyCovHdrData><RoleData><DisplayFieldName>Payor</DisplayFieldName></RoleData></PolicyHdrData>
我还在考虑如何添加带有 DisplayFieldname 的 Role 为 Insured,因为复杂性已经非常高了
【问题讨论】:
-
一开始自己尝试如何,如果您遇到困难,请继续向我们寻求帮助。 你试试,我帮你。你不试,我帮不了。
-
您可以使用 xslt 进程或反序列化(到一个对象)/映射(到另一个对象)/序列化(最终对象)。但我们不会做你的功课;)在此之前尝试自己
-
要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
-
“有人能帮帮我”的另一个问题是我们不知道你在做什么。你有 C# 编译器吗?你知道,但你根本不知道任何 C#?你知道一些 C#,但你得到一个错误?有什么错误?或者你没有得到错误但也没有得到你期望的结果?你的代码在哪里?你期待什么结果?你得到了什么?
-
理论上你应该能够实现你的第一个目标,即根据它们的 ID 值“移动”
PolicyCovHdr元素。但是,您使用什么标准来决定将Role元素移动到何处?我还没有解析你的代码,我只是想先了解一下你的问题的理论。