【问题标题】:Modfiying Xml using C#使用 C# 修改 Xml
【发布时间】: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 元素移动到何处?我还没有解析你的代码,我只是想先了解一下你的问题的理论。

标签: c# xml


【解决方案1】:

我认为您应该使用 XML 序列化/反序列化。你可以看看这个问题的例子:C# Xml Serialization & Deserialization

首先,您可以创建一个具有输入 XML 结构的对象,然后使用 XML Deserializer 将数据从 XML 加载到该对象。之后,您可以使用对象的实例并向您的代码添加一些您需要的条件。

您可以创建另一个表示输出 XML 的对象(取决于您所写的结构),并在 if/else 代码中用您需要的数据填充对象。 XML 的结构将由对象的结构来表示。最后,您可以使用 XML Serializer 创建您的 XML。

可能有更好的解决方案,但这也应该有效。

【讨论】:

  • 实际上,这并不像某些人想象的那么糟糕。对象将与数据高度耦合,但在这种情况下,我认为这是无法避免的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
相关资源
最近更新 更多