【问题标题】:replace value of element in XML替换 XML 中元素的值
【发布时间】:2018-11-09 10:29:44
【问题描述】:

我需要替换 <ResourceId> 元素的值。如果我之前删除所有内容 <VectorLayerDefinition> 在这个元素之后一切正常,但我有很多这些 xml 文件,我无法手动删除任何内容。有什么建议吗?

这里是xml代码:

<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about="sdf:FeatureClass1">
    <ns0:FeatureSource xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" rdf:resource="fsd://1" />
  </rdf:Description>
  <rdf:Description rdf:about="sdf:FeatureClass1">
    <rdf:type rdf:resource="http://www.autodesk.com/gis/resource/definitions/LayerDefinitionResource" />
  </rdf:Description>
  <rdf:Description rdf:about="sdf:FeatureClass1">
    <ns0:name xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">FeatureClass1</ns0:name>
  </rdf:Description>
  <rdf:Description rdf:about="sdf:FeatureClass1">
    <ns0:isURL xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">no</ns0:isURL>
  </rdf:Description>
  <rdf:Description rdf:about="sdf:FeatureClass1">
    <ns0:description xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">
    </ns0:description>
  </rdf:Description>
  <rdf:Description rdf:about="sdf:FeatureClass1">
    <ns0:LayerDefinitionResourceStream xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">
      <LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="LayerDefinition-2.4.0.xsd" version="2.4.0">
        <VectorLayerDefinition>
          <ResourceId>Library://SDF_1.FeatureSource</ResourceId>
          <FeatureName>sdf:FeatureClass1</FeatureName>
          <FeatureNameType>FeatureClass</FeatureNameType>
          <Geometry>Geometry</Geometry>  
    </VectorLayerDefinition>
      </LayerDefinition>
    </ns0:LayerDefinitionResourceStream>
  </rdf:Description>
  <rdf:Description rdf:about="fsd://1">
    <rdf:type rdf:resource="http://www.autodesk.com/gis/resource/definitions/FeatureSourceResource" />
  </rdf:Description>
  <rdf:Description rdf:about="fsd://1">
    <ns0:name xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">1</ns0:name>
  </rdf:Description>
  <rdf:Description rdf:about="fsd://1">
    <ns0:isURL xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">no</ns0:isURL>
  </rdf:Description>
  <rdf:Description rdf:about="fsd://1">
    <ns0:description xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">
    </ns0:description>
  </rdf:Description>
  <rdf:Description rdf:about="fsd://1">
    <ns0:FeatureSourceResourceStream xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">    </ns0:FeatureSourceResourceStream>
  </rdf:Description>
  <rdf:Description rdf:about="LayerSchema">
    <ns0:version xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">1</ns0:version>
  </rdf:Description>
</rdf:RDF>

这是我的代码:

public void Main()
{
    XDocument doc = XDocument.Load(@"D:\Repositories\Library\Content\Layers\FeatureClass1.LayerDefinition");
    string str = doc.Element("VectorLatyerDefinition").Element("ResourceId").Value;
    doc.Element("VectorLayerDefinition").Element("ResourceId").Value = "SomeValue";
    doc.Save(@"D:\Repositories\Library\Content\Layers\FeatureClass1.LayerDefinition");
}

但在我“清理”xml文件后它可以工作

【问题讨论】:

  • 如何在文件中删除或添加元素?基本上手动这样做是一个非常糟糕的主意。而是让序列化程序完成他们的工作,他们读取和写入文件。
  • 确实——我会通过加载XDocument,对其进行操作,然后再次保存来做到这一点。如果没有看到您的代码,将很难为您提供进一步的帮助。
  • @HimBromBeere 我只是打开文件并手动删除除&lt;VectorLayerDefinition&gt; 元素之外的所有内容。我尝试使用 linq 完成我的工作,但没有成功,因为我无法通过第一个节点。
  • 元素只在当前关卡中查找。您需要将递归向下树的后代。

标签: c# xml linq


【解决方案1】:

使用 xml liinq :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication80
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement resourceId = doc.Descendants("ResourceId").FirstOrDefault();
            resourceId.SetValue("//SDF_2.FeatureSource");

        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2022-01-11
    • 1970-01-01
    • 2015-03-02
    相关资源
    最近更新 更多