【问题标题】:C# Finding and replacing a part of XML innertextC# 查找和替换部分 XML 内部文本
【发布时间】:2017-03-07 14:59:22
【问题描述】:

对于一个项目,我正在创建一个与连接到 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 的元素,其中包含内部文本 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 使用 string,然后对该字符串进行操作。

标签: c# xml linq xmldocument


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2018-11-15
    • 2017-02-03
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多