C#查找并替换XML innertext的一部分

时间:2017-03-07 14:59:22

标签: c# xml linq xmldocument

对于项目,我正在创建一个应用程序,该应用程序与连接到TIA Portal V14,PLC / siemens环境的开放API一起使用。

对于这个应用程序,我基本上是从头开始构建一个XML文件。 为了实现这一点,我创建了自己的包含XML块的XML库文件,通过使用System.XML,我可以复制到模板中,最终创建一个XML文件,可以在Tia Portal中生成包含对象的屏幕。

我遇到的问题是,我似乎无法找到或想到一种方法来查找和替换元素内的

<VEG_Connection_Config>

    <!-- Static Properties hold objects with properties that are always the same -->
    <StaticProperties>

        <!-- List of static objects -->
        <GlobalLibraryObjects>

            <!-- valve -->
            <GlobalLibraryObject type="200" events="" properties="">
                <Hmi.Screen.SymbolLibrary ID="2" CompositionName="ScreenItems">
                    <!-- valve -->
                    <AttributeList>
                        <AboveUpperLimitColor>255, 0, 0</AboveUpperLimitColor>
                        <BackColor>192, 192, 192</BackColor>
                        <BackFillStyle>Transparent</BackFillStyle>
                        <BelowLowerLimitColor>255, 255, 0</BelowLowerLimitColor>
                        <BlinkColor>0, 0, 255</BlinkColor>
                        <Enabled>true</Enabled>
                        <FillColorMode>Original</FillColorMode>
                        <FixedAspectRatio>false</FixedAspectRatio>
                        <Flashing>None</Flashing>
                        <FlashingOnLimitViolation>false</FlashingOnLimitViolation>
                        <Flip>None</Flip>
                        <ForeColor>0, 0, 0</ForeColor>
                        <Height>46</Height>
                        <Left>10</Left>
                        <ObjectName>DB_Stat_obj.$TAGNAME</ObjectName>

这是我的XML库的一小部分。在底部,您可以看到一个名为ObjectName的元素,它包含innertext DB_Stat_obj。$ TAGNAME

$ TAGNAME是我要用CSV文件读取的标记名替换的部分。 因此,最终结果应该是DB_Stat_obj.1000P01。

现在我的问题是,是否有人知道如何使用System.XML查找$ TAGNAME并将其替换为其他内容。

我知道使用System.XML.LINQ我可以解析整个文件并使用以下代码替换该位:

string keyword = "$TAGNAME";
            var doc = XDocument.Load(screenLocation);
            List<XElement> query = doc.Descendants().
                                    Where(x => !x.HasElements && 
                                    x.Value.IndexOf(keyword, StringComparison.InvariantCultureIgnoreCase) >= 0).ToList();

            query.ForEach(n => n.Value = n.Value.Replace(keyword, objectName));

            doc.Save(screenLocation);

但考虑到我的整个应用程序是使用System.XML / XmlDocument完成的,我无法使用此代码。 我已经尝试将XmlDocument转换为XDocument只是为了替换$ TAGNAME并将其转换回来,但是它也没有用。 转换下面的代码

public static XmlDocument ToXmlDocument(this XDocument xDocument)
        {
            var xmlDocument = new XmlDocument();

            using (var xmlReader = xDocument.CreateReader())
            {
                xmlDocument.Load(xmlReader);
            }

            return xmlDocument;
        }

        public static XDocument ToXDocument(this XmlDocument xmlDocument)
        {
            using (var nodeReader = new XmlNodeReader(xmlDocument))
            {
                nodeReader.MoveToContent();
                return XDocument.Load(nodeReader);
            }
        }

我希望别人对此有一个了解,并指出我正确的方向。

TL; DR;如何使用SYSTEM.XML找到并替换innertext的一部分

谢谢,

// Jeroen

1 个答案:

答案 0 :(得分:0)

你会发现InnerText只是一个简单的字符串,所以你可以使用String.Replace()来实现所需的结果