удалить корневой узел, но сохранить все дочерние узлы - PullRequest
0 голосов
/ 18 июня 2019

У меня есть этот 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 есть ("Test") дочерние узлы, которые происходят много времени.Что мне нужно сделать, так это удалить (" <ns0:Root xmlns:ns0="http://Core.Schemas.SouCurrencyRate"> ")

, чтобы вывод 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 содержит только одного дочернего элемента («Test»), а не остальных.

Я также пытался использовать Linq, где я нашел это в сообщении

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

Но это возвращает то же самое и не помогает моему делу.

Может кто-то помочьмне в правильном направлении?

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Если вам действительно нужна только текстовая строка, самый быстрый способ добиться этого - использовать XmlReader на Root XElement:

XDocument xDoc = XDocument.Parse(bizobj.Message.BodyPart.GetOriginalDataStream());
XElement root = xDoc.Root;
XmlReader reader = root.CreateReader();
reader.MoveToContent();
string txt = reader.ReadInnerXml();
0 голосов
/ 19 июня 2019

Просто поместите мой окончательный код здесь, если кто-то хочет посмотреть и использовать его. В любом случае, именно Филбурт бросил меня в правильном направлении, так что выгляди так же, как и он.

 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;
...