Hướng dẫn make string xml compatible python - tạo chuỗi python tương thích với xml

Tôi đang viết một tệp XML bằng LXML và đang gặp sự cố với các ký tự điều khiển. Tôi đang đọc văn bản từ một tệp để gán cho một phần tử chứa các ký tự điều khiển. Khi tôi chạy tập lệnh, tôi nhận được lỗi này:

ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters

Vì vậy, tôi đã viết một chức năng nhỏ để thay thế các ký tự điều khiển bằng một '?', Khi tôi nhìn vào XML được tạo, có vẻ như các ký tự điều khiển là các dòng mới 0x0a. Với kiến ​​thức này, tôi đã viết một chức năng để mã hóa các ký tự điều khiển ở đó:

def encodeXMLText(text):
    text = text.replace("&",  "&")
    text = text.replace("\"", """)
    text = text.replace("'",  "'")
    text = text.replace("<",  "<")
    text = text.replace(">",  ">")
    text = text.replace("\n", "
")
    text = text.replace("\r", "
")
    return text

Điều này vẫn trả về cùng một lỗi như trước đây. Tôi muốn bảo tồn các dòng mới, vì vậy chỉ cần tước chúng không phải là một lựa chọn hợp lệ cho tôi. Không biết tôi đang làm gì sai vào thời điểm này. Tôi đang tìm cách để làm điều này với LXML, tương tự như thế này:

  ruleTitle = ET.SubElement(rule,'title')
  ruleTitle.text = encodeXMLText(titleText)

Các câu hỏi khác mà tôi đã đọc hoặc không sử dụng LXML hoặc không giải quyết các ký tự dòng mới (/n) và dòng (/r) như các ký tự điều khiển

Thoát XML

Thư viện tiêu chuẩn Python chứa một vài hàm đơn giản để thoát các chuỗi văn bản dưới dạng dữ liệu ký tự XML. Những thói quen này không thực sự mạnh mẽ lắm, nhưng đủ cho nhiều ứng dụng. Nói chung, chúng nên được áp dụng cho văn bản Unicode mà sau này sẽ được mã hóa một cách thích hợp hoặc cho văn bản đã được mã hóa bằng cách sử dụng mã hóa ASCII-superset, vì hầu hết các ký tự đều bị bỏ lại một mình.of text as XML character data. These routines are not actually very powerful, but are sufficient for many applications. They should generally be applied to Unicode text that will later be encoded appropriately, or to already-encoded text using an ASCII-superset encoding, since most characters are left alone.

Mô -đun xml.sax.saxutils chứa các hàm thoát () và quoteAd (). Hàm Escape () được sử dụng để chuyển đổi các ký tự thành tham chiếu thực thể tương ứng:quoteattr(). The escape() function is used to convert the <, &, and > characters to the corresponding entity references:

   1 >>> from xml.sax.saxutils import escape
   2 >>>
   3 >>> escape("< & >")
   4 '< & >'

Hàm này không tạo ra & apos; hoặc & quot; Tài liệu tham khảo thực thể; Chúng không cần thiết trong dữ liệu ký tự được phân tích cú pháp trong tài liệu XML. Chúng có thể cần thiết trong dữ liệu ký tự trong các giá trị thuộc tính, tuy nhiên. Đối với các giá trị thuộc tính, hàm trích dẫn () cung cấp dịch vụ hữu ích hơn Escape (). trích dẫn () sẽ xác định xem các dấu ngoặc kép đơn hay kép phù hợp hơn với giá trị thuộc tính và báo giá giá trị thích hợp; Các giá trị bao gồm cả hai loại dấu ngoặc kép trong nguyên nhân giá trị & quot; được sử dụng khi cần thiết. Giá trị trả về bao gồm các dấu ngoặc kép cần thiết để đảm bảo giá trị được trích dẫn đúng:these are not needed in parsed character data in an XML document. They may be needed in character data in attribute values, however. For attribute values, quoteattr() function provides a more useful service than escape(). quoteattr() will determine whether single or double quotation marks are more appropriate for an attribute value and quote the value appropriately; values which include both kinds of quotation marks in the value cause " to be used as needed. The return value includes the quotation marks which are needed to ensure the value is properly quoted:

   1 >>> from xml.sax.saxutils import quoteattr
   2 >>>
   3 >>> quoteattr("some value ' containing an apostrophe")
   4 '"some value \' containing an apostrophe"'
   5 >>> quoteattr('some value containing " a double-quote')
   6 '\'some value containing " a double-quote\''
   7 >>> quoteattr('value containing " a double-quote \' and an apostrophe')
   8 '"value containing " a double-quote \' and an apostrophe"'

Cả hai chức năng này có thể được cung cấp với một ánh xạ các thay thế bổ sung nên được thực hiện; Bản đồ giống nhau thường có thể được sử dụng cho cả hai. Điều này có thể được sử dụng để thêm các thực thể bổ sung cụ thể cho DTD của tài liệu được tạo hoặc để khiến các ký tự cụ thể được mã hóa dưới dạng tham chiếu ký tự:made; the same mapping can generally be used for both. This can be used to add additional entities specific to the DTD of the document being generated, or to cause particular characters to be encoded as character references:

   1 >>> escape("abc", {"b": "b"})
   2 'abc'
   3 >>> escape("My product, PyThingaMaJiggie, is really cool.",
   4 ...        {"PyThingaMaJiggie": "&productName;"})
   5 'My product, &productName;, is really cool.'

XML chưa được giải quyết

Mô -đun xml.sax.saxutils cũng cung cấp hàm unescape (). Hàm này chuyển đổi & amp ;, & gt ;, và & lt; Tài liệu tham khảo thực thể trở lại các ký tự tương ứng:function converts the &, >, and < entity references back to the corresponding characters:

   1 >>> from xml.sax.saxutils import unescape
   2 >>>
   3 >>> unescape("< & >")
   4 '< & >'

Lưu ý rằng các thực thể được xác định trước & apos; và & quot; không được hỗ trợ theo mặc định. Giống như các hàm Escape () và trích dẫn (), unescape () có thể được cung cấp một ánh xạ bổ sung các thay thế cần được thực hiện. Điều này có thể được sử dụng để thêm hỗ trợ cho các thực thể được xác định trước bổ sung:Like the escape() and quoteattr() functions, unescape() can be provided with an additional mapping of replacements that should be performed. This can be used to add support for the additional predefined entities:

   1 >>> unescape("' "", {"'": "'", """: '"'})
   2 '\' "'

Điều này cũng có thể được sử dụng để thực hiện thay thế cho các chuỗi dài hơn.

Lưu ý rằng hàm unescape () không liên quan đến các tham chiếu ký tự tùy ý. Điều này có thể được thực hiện bằng cách chuyển một bản đồ thực sự lớn như là đối số thứ hai, nhưng điều đó khá ngớ ngẩn với kích thước của bản đồ cần thiết để hỗ trợ cả tài liệu tham khảo ký tự thập phân và thập lục phân (và các tài liệu tham khảo thập lục phân có chứa A-F sẽ được tính toán trong Tất cả các hoán vị của chữ hoa và chữ thường, và các số không hàng đầu sẽ cần được xem xét). Nếu chúng tôi muốn các tài liệu tham khảo ký tự được xem xét, chúng tôi có thể sử dụng trình phân tích cú pháp XML của người nước ngoài đi kèm với tất cả các phiên bản gần đây của Python. Chức năng này sẽ thực hiện thủ thuật:could be accomplished by passing in a really large mapping as the second argument, but that's pretty silly given the size of the mapping that's required to support both decimal and hexadecimal character references (and the hexadecimal references containing A-F would need to be accounted for in all permutations of upper and lower case, and leading zeros would need to be considered). If we want character references to be considered, we can use the Expat XML parser included with all recent versions of Python. This function will do the trick:

   1 import xml.parsers.expat
   2 
   3 def unescape(s):
   4     want_unicode = False
   5     if isinstance(s, unicode):
   6         s = s.encode("utf-8")
   7         want_unicode = True
   8 
   9     
  10     list = []
  11 
  12     
  13     p = xml.parsers.expat.ParserCreate("utf-8")
  14     p.buffer_text = True
  15     p.returns_unicode = want_unicode
  16     p.CharacterDataHandler = list.append
  17 
  18     
  19     
  20     p.Parse("", 0)
  21     p.Parse(s, 0)
  22     p.Parse("", 1)
  23 
  24     
  25     es = ""
  26     if want_unicode:
  27         es = u""
  28     return es.join(list)

Lưu ý công việc bổ sung chúng ta phải đi để kết quả có cùng loại với đầu vào; Điều này đến miễn phí với các cách tiếp cận dựa trên .replace ().this came for free with the .replace()-based approaches.

Sử dụng hàm unescape () này cung cấp hỗ trợ cho các tham chiếu ký tự và các thực thể được xác định trước, nhưng không cho phép chúng tôi mở rộng ánh xạ với các định nghĩa thực thể bổ sung (mặc dù là một hàm phức tạp hơn có thể làm cho điều đó có thể). Giả sử chúng tôi đã nhập nó từ bất kỳ mô -đun nào chúng tôi lưu trữ, chúng tôi nhận được:predefined entities, but does not let us extend the mapping with additional entity definitions (a more elaborate function could make that possible, though). Assuming we've imported this from whatever module we stored it in, we get:

   1 >>> unescape("abc")
   2 'abc'
   3 >>> unescape(u"abc")
   4 u'abc'
   5 >>> unescape("abc")
   6 'abc'

Chúng tôi cũng nhận được hỗ trợ cho các cấu trúc mà chúng tôi có thể không muốn trong một số bối cảnh, mặc dù những điều này có thể được chấp nhận vì chúng tôi đang xem dữ liệu XML:are probably acceptable since we're looking at XML data:

def encodeXMLText(text):
    text = text.replace("&",  "&")
    text = text.replace("\"", """)
    text = text.replace("'",  "'")
    text = text.replace("<",  "<")
    text = text.replace(">",  ">")
    text = text.replace("\n", "
")
    text = text.replace("\r", "
")
    return text
0

Xem thêm

  • Escapinghtml

Làm cách nào để đọc chuỗi XML trong Python?

Có hai cách để phân tích tệp bằng mô -đun 'ElementTree'. Đầu tiên là bằng cách sử dụng hàm parse () và hàm thứ hai là fromString () hàm. Hàm parse () phân tích cú pháp tài liệu XML được cung cấp dưới dạng tệp trong khi đó, từ các phân tích cú pháp XML khi được cung cấp dưới dạng chuỗi i.e trong trích dẫn ba.using the parse() function and the second is fromstring() function. The parse () function parses XML document which is supplied as a file whereas, fromstring parses XML when supplied as a string i.e within triple quotes.

Mô -đun Python nào phù hợp nhất để phân tích các tài liệu XML?

Mô -đun Python được sử dụng: Bài viết này sẽ tập trung vào việc sử dụng mô -đun XML sẵn có trong Python để phân tích cú pháp XML và trọng tâm chính sẽ là API XML ElementTree của mô -đun này.

Thư viện XML cho Python là gì?

Thư viện tiêu chuẩn Python cung cấp một bộ giao diện tối thiểu nhưng hữu ích để hoạt động với XML.Hai API cơ bản và được sử dụng rộng nhất cho dữ liệu XML là các giao diện Sax và DOM.API đơn giản cho XML (SAX) - Tại đây, bạn đăng ký các cuộc gọi lại cho các sự kiện quan tâm và sau đó để trình phân tích cú pháp tiến hành thông qua tài liệu.

Tên của python được xây dựng trong mô -đun cho xử lý XML là gì?

Mô -đun xml.etree.elementtree thực hiện API đơn giản và hiệu quả để phân tích và tạo dữ liệu XML.Thay đổi trong phiên bản 3.3: Mô -đun này sẽ sử dụng triển khai nhanh bất cứ khi nào có sẵn.