C# 查找和替换 XML innertext 的一部分
C# Finding and replacing a part of XML innertext
对于一个项目,我正在创建一个应用程序,该应用程序可与连接到 TIA Portal V14、PLC/siemens 环境的开放 API 一起使用。
对于这个应用程序,我基本上是从头开始构建一个 XML 文件。
为此,我创建了自己的 XML-library 文件,其中包含 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 的一部分
谢谢,
// 杰伦
您会发现 InnerText 只是一个简单的字符串,因此您可以使用 String.Replace() 来获得所需的结果
对于一个项目,我正在创建一个应用程序,该应用程序可与连接到 TIA Portal V14、PLC/siemens 环境的开放 API 一起使用。
对于这个应用程序,我基本上是从头开始构建一个 XML 文件。 为此,我创建了自己的 XML-library 文件,其中包含 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 的一部分谢谢,
// 杰伦
您会发现 InnerText 只是一个简单的字符串,因此您可以使用 String.Replace() 来获得所需的结果