【问题标题】:remove root node but keep all child nodes删除根节点但保留所有子节点
【发布时间】:2019-06-18 06:35:05
【问题描述】:

我有这个通过

解析的 xml
<ns0:Root xmlns:ns0="http://Core.Schemas.SouCurrencyRate">
    <Test>
        <CurrencyCode>SEKAUDPMI</CurrencyCode>
        <CurrencyType>AUD</CurrencyType>
        <CurrencyDate>2019 Juni</CurrencyDate>
        <CurrencyRate>6.5656</CurrencyRate>
        <RecordCreated>2019-06-30</RecordCreated>
        <RecordCreatedSOP>2019-06-01</RecordCreatedSOP>
    </Test>
    <Test>
        <CurrencyCode>SEKBRLPMI</CurrencyCode>
        <CurrencyType>BRL</CurrencyType>
        <CurrencyDate>2019 Juni</CurrencyDate>
        <CurrencyRate>2.4376</CurrencyRate>
        <RecordCreated>2019-06-30</RecordCreated>
        <RecordCreatedSOP>2019-06-01</RecordCreatedSOP>
    </Test>
    <Test>
        <CurrencyCode>SEKCADPMI</CurrencyCode>
        <CurrencyType>CAD</CurrencyType>
        <CurrencyDate>2019 Juni</CurrencyDate>
        <CurrencyRate>7.0771</CurrencyRate>
        <RecordCreated>2019-06-30</RecordCreated>
        <RecordCreatedSOP>2019-06-01</RecordCreatedSOP>
    </Test>
    <Test>
        <CurrencyCode>SEKCHFPMI</CurrencyCode>
        <CurrencyType>CHF</CurrencyType>
        <CurrencyDate>2019 Juni</CurrencyDate>
        <CurrencyRate>951.7346</CurrencyRate>
        <RecordCreated>2019-06-30</RecordCreated>
        <RecordCreatedSOP>2019-06-01</RecordCreatedSOP>
    </Test>
</ns0:Root>

xml 有(“测试”)子节点出现很多时间。 我需要做的实际上是删除(" &lt;ns0:Root xmlns:ns0="http://Core.Schemas.SouCurrencyRate"&gt; ")

这样XML输出就是

<Test>
    <CurrencyCode>SEKAUDPMI</CurrencyCode>
    <CurrencyType>AUD</CurrencyType>
    <CurrencyDate>2019 Juni</CurrencyDate>
    <CurrencyRate>6.5656</CurrencyRate>
    <RecordCreated>2019-06-30</RecordCreated>
    <RecordCreatedSOP>2019-06-01</RecordCreatedSOP>
</Test>
<Test>
    <CurrencyCode>SEKBRLPMI</CurrencyCode>
    <CurrencyType>BRL</CurrencyType>
    <CurrencyDate>2019 Juni</CurrencyDate>
    <CurrencyRate>2.4376</CurrencyRate>
    <RecordCreated>2019-06-30</RecordCreated>
    <RecordCreatedSOP>2019-06-01</RecordCreatedSOP>
</Test>

我尝试做的是

    System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
    xDoc.Load(bizobj.Message.BodyPart.GetOriginalDataStream());


    System.Xml.XmlNode xNode = xDoc.FirstChild;
    System.Xml.XmlNode xParent = xNode.ParentNode;
    System.Xml.XmlNodeList xChilds = xNode.ChildNodes;
    xDoc.RemoveChild(xNode);
    foreach (System.Xml.XmlNode node in xChilds)
    {
        xParent.AppendChild(node);
    }

但主要问题是返回的 xml 只包含一个孩子(“测试”)而不包含其他孩子。

我也尝试过使用 Linq,我在帖子中发现了这个

XDocument input = XDocument.Load("input.xml");
XElement firstChild = input.Root.Elements().First();

但这会返回相同的结果,并且对我的情况没有帮助。

有人可以帮助我朝正确的方向前进吗?

谢谢。

【问题讨论】:

  • 您描述的结果不是有效的 Xml - 您需要一个元素作为文档的根。我的猜测:可能是您的问题在于处理命名空间前缀ns0
  • @Filburt 我不需要它是一个有效的 XML,我只需要输出我想要的结果。
  • 你不能使用XDocument 来表示格式错误的 XML。为什么不直接返回List&lt;XElement&gt;,然后单独序列化每个?

标签: c# xml linq-to-xml element xmldocument


【解决方案1】:

如果你真的只需要文本字符串,最快的方法是在Root XElement 上使用 XmlReader:

XDocument xDoc = XDocument.Parse(bizobj.Message.BodyPart.GetOriginalDataStream());
XElement root = xDoc.Root;
XmlReader reader = root.CreateReader();
reader.MoveToContent();
string txt = reader.ReadInnerXml();

【讨论】:

  • 感谢您向正确的方向投掷,我已经解决了您的意见。再次感谢伙计。
【解决方案2】:

如果有人想看看并使用它,请将我的最终代码放在这里。 无论如何,菲尔伯特是让我朝着正确方向前进的那个人,所以也要像他一样。

 System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
        xDoc.Load(bizobj.Message.BodyPart.GetOriginalDataStream());
        string output = xDoc.DocumentElement.InnerXml;
    byte[] byteArray = Encoding.ASCII.GetBytes(output);
    MemoryStream stream = new MemoryStream(byteArray);

    stream.Position = 0;
    bizobj.Message.BodyPart.Data = stream;


    return bizobj;

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多