Đọc một XML (từ một chuỗi) và nhận một số trường - Sự cố khi đọc XML


82

Tôi có XML này (được lưu trữ trong một chuỗi C # được gọi là myXML)

<?xml version="1.0" encoding="utf-16"?>
<myDataz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <listS>
    <sog>
      <field1>123</field1>
      <field2>a</field2>
      <field3>b</field3>
    </sog>
    <sog>
      <field1>456</field1>
      <field2>c</field2>
      <field3>d</field3>
    </sog>
  </listS>
</myDataz>

và tôi muốn duyệt qua tất cả các <sog>phần tử. Đối với mỗi người trong số họ, tôi muốn in đứa trẻ <field1>.

Vì vậy, đây là mã của tôi:

XmlDocument xmlDoc = new XmlDocument();
string myXML = "<?xml version=\"1.0\" encoding=\"utf-16\"?><myDataz xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><listS><sog><field1>123</field1><field2>a</field2><field3>b</field3></sog><sog><field1>456</field1><field2>c</field2><field3>d</field3></sog></listS></myDataz>"
xmlDoc.Load(myXML);
XmlNodeList parentNode = xmlDoc.GetElementsByTagName("listS");
foreach (XmlNode childrenNode in parentNode)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
}

nhưng có vẻ như tôi không thể đọc một chuỗi dưới dạng XML? tôi cóSystem.ArgumentException


2
Ngoại lệ nói gì?
SLaks

Bạn có thể sử dụng XDocument trong .NET 4.0 không?
JohnD

Tôi đang sử dụng .NET 3.5! Tôi đã viết ngoại lệ!
markzzz

1
Thông báo ngoại lệ là gì?
SLaks

XLINQ được hỗ trợ đầy đủ trên .Net 3.5 và dễ sử dụng hơn nhiều.
SLaks

Câu trả lời:


107

Bạn nên sử dụng phương thức LoadXml, không phải Tải:

xmlDoc.LoadXml(myXML); 

Phương thức tải đang cố gắng tải xml từ một tệp và LoadXml từ một chuỗi. Bạn cũng có thể sử dụng XPath:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

string xpath = "myDataz/listS/sog";
var nodes = xmlDoc.SelectNodes(xpath);

foreach (XmlNode childrenNode in nodes)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
} 

Dễ dàng tuyệt vời. Cuối cùng tôi có thể bắt đầu làm việc với các API :).
C4d

7
Thay vì SelectSingleNode("//field1").Valuenó phải là SelectSingleNode("//field1").InnerTexthoặc SelectSingleNode("//field1").InnerXml, bởi vì Giá trị sẽ là null, vì nó không phải là một thuộc tính, nhưng giá trị nằm giữa các thẻ.
Mathias Conradt

3
Để thêm vào @MathiasConradt, SelectSingleNode("field1").InnerTextnếu bạn không muốn luôn đọc field1lần xuất hiện đầu tiên của myDataz / listS / sog.
Matthieu M.

19

Sử dụng Linq-XML,

XDocument doc = XDocument.Load(file);

var result = from ele in doc.Descendants("sog")
              select new
              {
                 field1 = (string)ele.Element("field1")
              };
 foreach (var t in result)
  {
      HttpContext.Current.Response.Write(t.field1);
  }

HOẶC: Lấy danh sách nút của <sog>thẻ.

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(myXML);
 XmlNodeList parentNode = xmlDoc.GetElementsByTagName("sog");
 foreach (XmlNode childrenNode in parentNode)
  {
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("field1").InnerText);
   }

11

Các câu trả lời khác đã có từ vài năm trước (và không hoạt động với Windows Phone 8.1), vì vậy tôi nghĩ rằng tôi sẽ thả vào một tùy chọn khác. Tôi đã sử dụng điều này để phân tích cú pháp phản hồi RSS cho một ứng dụng Windows Phone:

XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(xml_string);

3

Hoặc sử dụng lớp XmlSerializer.

XmlSerializer xs = new XmlSerializer(objectType);
obj = xs.Deserialize(new StringReader(yourXmlString));

2

Tôi đã sử dụng System.Xml.Linq.XElement cho mục đích. Chỉ cần kiểm tra mã bên dưới để đọc giá trị của nút con đầu tiên của xml (không phải nút gốc).

        string textXml = "<xmlroot><firstchild>value of first child</firstchild>........</xmlroot>";
        XElement xmlroot = XElement.Parse(textXml);
        string firstNodeContent = ((System.Xml.Linq.XElement)(xmlroot.FirstNode)).Value;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.