【问题标题】:Error inserting XML data into database via LINQ通过 LINQ 将 XML 数据插入数据库时​​出错
【发布时间】:2012-07-03 07:08:04
【问题描述】:

我想使用 LINQ 在数据库中插入一些字段。其中一个字段包含 XML 数据 (GPX)。

当我运行以下代码时:

 rtlq.GpxData = new XElement(route.GpxData);

我得到了这个例外:

名称不能以'<' 字符开头,十六进制值0x3C

我想说route.GpxData 有一个字符串类型,我将此类型转换为xml。 这是我的全部代码:

public int Save(Route route)
{
    aspnetdbDataContext aspdb = new aspnetdbDataContext();
    RouteLinq rtlq=new RouteLinq();
    rtlq.UserId = route.UserId;
    rtlq.SourceName = route.Name;

    //I have an error here
    rtlq.GpxData = new XElement(route.GpxData);
    rtlq.CreationTime = route.Time;
    aspdb.RouteLinqs.InsertOnSubmit(rtlq);
    aspdb.SubmitChanges();

    int k1;
    System.Data.Linq.ChangeSet cs1 = aspdb.GetChangeSet();
    k1=cs1.Inserts.Count();

    TrackPointlinq trlq = new TrackPointlinq();
    foreach (var trackpoint in route.TrackPoints)
    {
        trlq.RouteFK=route.Id;
        trlq.TrackTime=trackpoint.Time;
        trlq.Latitude=(float) trackpoint.Latitude;
        trlq.Longitude=(float)trackpoint.Longitude;
        trlq.Elevation=trackpoint.Elevation;
    }

    aspdb.TrackPointlinqs.InsertOnSubmit(trlq);
    aspdb.SubmitChanges();

    int k2;
    System.Data.Linq.ChangeSet cs2 = aspdb.GetChangeSet();
    k2 = cs2.Inserts.Count();

    if ((k1 == 0) && (k2 == 0))
    {
        return 1;
    }
    else
        return 0;
}

你能帮我解决这个问题吗?

编辑 XML 文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpsies="http://www.gpsies.com/GPX/1/0" creator="GPSies http://www.gpsies.com - GpsiesTrack" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.gpsies.com/GPX/1/0 http://www.gpsies.com/gpsies.xsd">
  <metadata>
    <name>GpsiesTrack</name>
    <link href="http://www.gpsies.com/">
      <text>GpsiesTrack on GPSies.com</text>
    </link>
    <time>2012-06-26T18:58:39Z</time>
  </metadata>
  <trk>
    <name>GpsiesTrack on GPSies.com</name>
    <trkseg>
      <trkpt lat="50.81482934" lon="12.90653228">
        <ele>305.00000</ele>
        <time>2012-05-01T00:00:00Z</time>
      </trkpt>
      <trkpt lat="50.85364209" lon="12.92404174">
        <ele>297.00000</ele>
        <time>2012-05-01T00:15:27Z</time>
      </trkpt>
    </trkseg>
  </trk>
</gpx>

【问题讨论】:

  • 应该是 XmlDocument 而不是 XElement ?
  • 你能发布一个 route.GpxData 值的样本
  • 它应该加载 xml。使用 XmlDocument doc = new XmlDocument(); doc.LoadXml(route.GpxData);
  • 如果您仍想使用 XElement,请记住您使用的构造函数重载需要元素名称,而我认为您想提供数据而不是名称,因此请使用重载 new XElement(name,route.GpxData)
  • 这是因为 rtlq.GpxData 是 XElement 类型,而 doc 是 XmlDocument 类型。在这种情况下,正如 Marc 建议的那样,使用 XElement.Parse。

标签: c# .net xml database linq


【解决方案1】:

route.GpxData 大概是 XML 中的字符串。接受字符串名称的XElement 构造函数将寻求将其转换为表示 XML 元素的对象。 XML 元素 NAME 不能包含 &lt; 字符,尽管 `

【讨论】:

  • 确实;在这种情况下,替换为rtlq.GpxData = XElement.Parse(route.GpxData); 应该可以修复它
  • 嗨 Marc,我想我的问题已经解决了,我没有看到这个错误,而是另一个错误,我想我应该发布另一个问题,我怎样才能将你的答案标记为 ANSWER
  • 我仍然收到此错误,但我的文件中没有名称属性以 开头
【解决方案2】:

试试

rtlq.GpxData = XElement.Parse(route.GpxData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多