Как получить элемент XML с использованием XML Predicate <XmlNode>? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть следующие строки

XmlNode controlNode = comparison.ControlDetails.Target;
XmlAttribute attr = controlNode as XmlAttribute; //I believe this line needs changing.

Моя цель - получить узел XML, [0] {Element, Name = “creationTimestamp”}, я не уверен, как получить этот узел XML иБуду признателен за некоторую помощь, пожалуйста, дайте мне знать, если вы хотите получить больше информации, я просто застрял на этом и был в течение нескольких дней, пожалуйста, помогите мне получить вышеуказанный элемент, я добавил свой метод.

отладка

Ниже приведен мой класс ElementDifferenceEvaluatorTest.cs со сборщиком xml и diff.

[TestFixture]
    public class ElementDifferenceEvaluatorTest
    {
        [Test]
        public void TestUserguideExample()
        {   string xmla = @"<sbl xmlns:fpml='www.test.co.uk'>
            <creationTimestamp>2018-09-12T17:33:06+01:00</creationTimestamp>
            <messageVersion>2.0</messageVersion>
            <publishedVersions>2.0</publishedVersions>
            <waqeBundle>
            <reference>123456</reference>
            <firstReference>1234567</firstReference>
            <version>15151515</version>
            <type>The-Buumi</type>
            <action>Yes</action>
            <subAction>new_sumie</subAction>
            </waqeBundle>
            <sourceEnvironment>UAT2</sourceEnvironment>
            </sbl>";

            string xmlb =
            @"<sbl xmlns:fpml='www.test.co.uk'>
            <messageVersion>2.0</messageVersion>
            <publishedVersions>2.0</publishedVersions>
            <waqeBundle>
            <reference>123456</reference>
            <firstReference>1234567</firstReference>
            <version>15151515</version>
            <type>The-Buumi</type>
            <action>Yes</action>
            <subAction>new_sumie</subAction>
            </waqeBundle>
            <sourceEnvironment>UAT2</sourceEnvironment>
            </sbl>";

            var myDiff = DiffBuilder.Compare(xmla).WithTest(xmlb)
                .WithDifferenceEvaluator(new ElementDifferenceEvaluator("creationTimestamp").Evaluate)
                .IgnoreComments()
                .CheckForSimilar()
                .Build();

            Assert.IsFalse(myDiff.HasDifferences(), myDiff.ToString());
        }
    }
}

Следующим является мой ElementDifferenceEvaluator.cs

public class ElementDifferenceEvaluator
    {
        private string attributeName;

        public ElementDifferenceEvaluator(string attributeName)

        {
            this.attributeName = attributeName;

        }

        public ComparisonResult Evaluate(Comparison comparison, ComparisonResult outcome)

        {
            if (outcome == ComparisonResult.EQUAL || outcome == ComparisonResult.SIMILAR)
                return outcome; // only evaluate differences. 

            XmlNode controlNode = comparison.ControlDetails.Target; //why is this null?
            XmlAttribute attr = controlNode as XmlAttribute; //Why is this null?

            if (attr != null)

            {
                if (attr.Name == attributeName)
                {
                    return ComparisonResult.SIMILAR; // will evaluate this difference as similar 

                }
            }
            return outcome;
        } 
     }
}

1 Ответ

0 голосов
/ 26 сентября 2018

Я полагаю, вы хотите получить узел <creationTimeStamp/>?Если это так, я бы сделал это так:

XmlDocument xdoc = new XmlDocument();
doc.LoadXml("your XML as a string");  //as an alternative, check out doc.Load()
XmlNodeList aNodes = xdoc.GetElementsByTagName("creationTimeStamp");

Он содержит все теги по имени creationTimeStamp, вы можете использовать aNodes[0] для первого элемента.Теперь у вас есть возможность искать атрибуты или другие вещи, я в основном использую .InnerXml

...