【问题标题】:Split XML into Strings将 XML 拆分为字符串
【发布时间】:2016-02-03 16:02:52
【问题描述】:

我希望将 XML 文档拆分为字符串列表,但我完全不知所措。

<RISKCALC-OUT>
  <AUTHENTICATION>
    <USERID></USERID>
  </AUTHENTICATION>
  <OPERATION-LIST>
    <OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGET="New Platform">
      .......
    </OPERATION>
    <OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGET="New Platform">
      .....
    </OPERATION>
  </OPERATION-LIST>
</RISKCALC-OUT>

我正在尝试将此文件拆分为字符串,以便第一个操作节点下方的所有内容都在一个字符串中,然后第二个操作节点下方的所有内容都在第二个字符串中。

我一直在玩 XmlNodeLists,但我一无所获。我不需要一个完整的答案,只需要如何将它们分开准备放入单独的字符串。

感谢您的帮助。

【问题讨论】:

  • 请显示一个示例结果,这样它就不会模棱两可,人们不会在黑暗中松懈搜索。这些是您希望在第一个字符串中看到的......并且在第二个字符串中看到的相同吗?
  • 不需要分离任何东西,您需要使用 XPath 或 LINQ to XML 选择操作节点。您可以使用//OPERATION XPath 表达式返回所有操作节点,例如XmlDocument.SelectNodes。如果您改用 XDocument,则可以键入 LINQ 查询而不是 XPath
  • 抱歉,每个操作看起来像这样:gist.github.com/robbiewoods05/0a50ff5d1905e8f1ff83 这正是我希望每个字符串看起来的样子。

标签: c# xml string


【解决方案1】:

我会使用 LinQ to Xml。
维护更简单。

XElement xmla = XElement.Load("input.xml");
var results = from operationList in xmla.Descendants("OPERATION")
                select operationList.Value;
foreach (var result in results)
{
    Console.WriteLine(result);
}

编辑两全其美
(其实这里有三个世界:Object/String 和 XML)

保存数据的类:

class Operation
{
    public String Model { get; set; }
    public String SubModel { get; set; }
    // and so on ...

    public String TagContent { get; set; }
    public String FullTag{ get; set; }
}

进行 linq 查询:

XElement xmla = XElement.Load("input.xml");
var operations = from operation in xmla.Descendants("OPERATION")
                    select new Operation
                    {
                        Model = operation.Attribute("MODEL").Value,
                        SubModel = operation.Attribute("SUBMODEL").Value,
                        TagContent = operation.Value,
                        FullTag = operation.ToString(),

                    };
foreach (var operation in operations)
{
    Console.WriteLine(operation.Model + " - " + operation.SubModel+ " - " + operation.TagContent " - " + operation.FullTag);
}

问候

【讨论】:

  • 这与我所追求的非常接近,但我也想保留标签...有什么办法吗?
  • 您想保留 。或者你想拥有一个操作持有模型,子模型信息中的所有信息?
  • 我想保留每个标签,包括 等,以及您的第一个解决方案提供的所有信息。
  • @Robert : 可能是上面的编辑回答了你所有的愿望
【解决方案2】:

您可以像这样使用 LINQ to XML:

static void Main(string[] args)
{
    string path = "XMLFile1.xml";
    XDocument xdoc = XDocument.Load(path);
    var ops = xdoc.Descendants("OPERATION")
        .Elements()
        .Select(n => n.ToString())
        .ToList<string>();

    ops.ForEach(s => Console.WriteLine(s));
}

我使用了这个示例 XML(为了测试目的添加了随机的东西):

<RISKCALC-OUT>
  <AUTHENTICATION>
    <USERID></USERID>
  </AUTHENTICATION>
  <OPERATION-LIST>
    <OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGET="New Platform">
      <SUBNODES ID="1">
        <ANOTHER ID="56"></ANOTHER>
      </SUBNODES>
    </OPERATION>
    <OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGET="New Platform">
      <SUBNODES ID="1">
        <ANOTHER ID="65"></ANOTHER>
      </SUBNODES>
    </OPERATION>
  </OPERATION-LIST>
</RISKCALC-OUT>

并用上面的代码得到这个输出:

<SUBNODES ID="1">
  <ANOTHER ID="56"></ANOTHER>
</SUBNODES>
<SUBNODES ID="1">
  <ANOTHER ID="65"></ANOTHER>
</SUBNODES>

要保留 OPERATION 节点,您可以像这样删除 Elements():

var ops = xdoc.Descendants("OPERATION")
            .Select(n => n.ToString())
            .ToList<string>();

这会产生

<OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGE
T="New Platform">
  <SUBNODES ID="1">
    <ANOTHER ID="56"></ANOTHER>
  </SUBNODES>
</OPERATION>
<OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGE
T="New Platform">
  <SUBNODES ID="1">
    <ANOTHER ID="65"></ANOTHER>
  </SUBNODES>
</OPERATION>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多